Shell程式設計-shell變數2-位置變數和預定義變數
1.位置變數
例子:
#!/bin/bash
echo '$0='$0
echo "$1="$1
echo "\$2="$2
echo "\$*="$*
echo "\$@="$@
echo "\$#="$#
可以看到$@和$* 顯示了所有的引數
$#顯示了幾個引數
$n表示了第幾個引數
$0表示命令本身(也算一個引數)
[root@VM_0_16_centos es]# /home/es/shell1 1 a 2 c abcd
$0=/home/es/shell1
1=1
$2=a
$*=1 a 2 c abcd
$@=1 a 2 c abcd
$#=5
例子2:
#!/bin/bash
echo '$0='$0
echo "$1="$1
echo "\$2="$2
echo "\$*="$*
echo "\$@="$@
echo "\$#="$#
echo "\$*"
for i in $*
do
echo $i
done
echo "\$@"
for i in $@
do
echo $i
done
echo "*"
for i in "$*"
do
echo $i
done
echo "@"
for i in "$@"
do
echo $i
done
執行:[root@VM_0_16_centos es]# /home/es/shell1 1 a 2 c abcd
執行結果:
$0=/home/es/shell1
1=1
$2=a
$*=1 a 2 c abcd
$@=1 a 2 c abcd
$#=5
$*
1
a
2
c
abcd
$@
1
a
2
c
abcd
*
1 a 2 c abcd
@
1
a
2
c
abcd
觀察可以看到"$@"會分成每個詞處理,而"$*"則是當成整個詞處理
2.shift指令
左移1位操作,如上面的引數1 a 2 c abcd,左移後1就沒了變為a 2 c abcd
例子:
#!/bin/bash
echo '$0='$0
echo "$1="$1
echo "\$2="$2
echo "\$*="$*
echo "\$@="$@
echo "\$#="$#
shift
echo "\$*="$*
echo "\$@="$@
echo "\$#="$#
執行:[root@VM_0_16_centos es]# /home/es/shell2 1 a 2 b abcd
執行結果:
$0=/home/es/shell2
1=1
$2=a
$*=1 a 2 b abcd
$@=1 a 2 b abcd
$#=5
$*=a 2 b abcd
$@=a 2 b abcd
$#=4
3.預定義變數
$? 執行上一個命令的返回值,執行成功,返回0,執行失敗,返回非0(具體數字由命令決定)
$$ 當前程式的程式號(PID),即當前指令碼執行時生產的程式號
$! 後臺執行的最後一個程式的程式號(PID),最近一個被放入後臺執行的程式 加上&
例子:
#!/bin/bash
pwd
echo "\$$="$$
#放到後臺執行,並將結果放到dev/null中
ls /etc >/dev/null &
echo "\$!="$!
執行:bash shell3
執行結果:
/home/es
$$=20080
$!=20081
20080是前臺程式號
20081是後臺程式號
其中,例子中的/dev/null是一個空洞
例子2:
控制檯中執行:nohup ls /etc/ &
執行結果
[root@VM_0_16_centos es]# nohup ls /etc/ &
[1] 20221
[root@VM_0_16_centos es]# nohup: ignoring input and appending output to ‘nohup.out’
[1]+ Done nohup ls /etc/
[root@VM_0_16_centos es]#
執行ll檢視檔案:
[root@VM_0_16_centos es]# ll
total 44
-rwxr-xr-x 1 root root 18 May 10 14:44 firstshell
-rw-r--r-- 1 es root 136 May 9 09:28 hello2.txt.tar.gz
-rwxrwxrwx 1 es es 156 May 9 12:38 hello.txt
-rw-rw-r-- 1 es es 136 May 8 19:21 hello.txt.tar.gz
-rw-rw-r-- 1 es es 182 May 8 19:12 hello.txt.zip
-rw------- 1 root root 2140 May 11 09:49 nohup.out
-rwxr-xr-x 1 root root 255 May 11 09:16 shell1
-rwxr-xr-x 1 root root 146 May 11 09:39 shell2
-rw-r--r-- 1 root root 117 May 11 09:46 shell3
drwxr-xr-x 2 es es 4096 May 9 09:32 temp
drwxr-xr-x 2 root root 4096 May 8 19:10 tody
可以看到一個nohup.out檔案,cat一下:
[root@VM_0_16_centos es]# cat nohup.out
acpi
adjtime
aliases
alternatives
anacrontab
asound.conf
at.deny
audisp
audit
avahi
bash_completion.d
bashrc
binfmt.d
centos-release
centos-release-upstream
chkconfig.d
chrony.conf
chrony.keys
cifs-utils
cloud
containers
省略n行
這裡面是什麼呢?就是ls /etc/的執行結果,nohup將命令執行的結果放到了當前目錄的nohup.out檔案中了。
例子3:$?
執行pwd
然後執行echo $?
[root@VM_0_16_centos es]# pwd
/home/es
[root@VM_0_16_centos es]# echo $?
0
執行結果0表示上一條命令執行成功
例子4:執行時沒有許可權,$?返回126
[root@VM_0_16_centos es]# ./secondshell
-bash: ./secondshell: Permission denied
[root@VM_0_16_centos es]# echo $?
126
[root@VM_0_16_centos es]#
還可以合併成一條語句:
[root@VM_0_16_centos ~]# pwd ;echo $?
/root
0
;不管前面是否執行成功,都會執行;後面的語句
&&前面執行成功了才會執行後面的語句,否則不執行後面的語句命令。
[root@VM_0_16_centos ~]# wdd && echo $?
-bash: wdd: command not found
[root@VM_0_16_centos ~]#
[root@VM_0_16_centos ~]# pwd && echo $?
/root
0
例子:
#!/bin/bash
echo '$0='$0
echo "$1="$1
echo "\$2="$2
echo "\$*="$*
echo "\$@="$@
echo "\$#="$#
可以看到$@和$* 顯示了所有的引數
$#顯示了幾個引數
$n表示了第幾個引數
$0表示命令本身(也算一個引數)
[root@VM_0_16_centos es]# /home/es/shell1 1 a 2 c abcd
$0=/home/es/shell1
1=1
$2=a
$*=1 a 2 c abcd
$@=1 a 2 c abcd
$#=5
例子2:
#!/bin/bash
echo '$0='$0
echo "$1="$1
echo "\$2="$2
echo "\$*="$*
echo "\$@="$@
echo "\$#="$#
echo "\$*"
for i in $*
do
echo $i
done
echo "\$@"
for i in $@
do
echo $i
done
echo "*"
for i in "$*"
do
echo $i
done
echo "@"
for i in "$@"
do
echo $i
done
執行:[root@VM_0_16_centos es]# /home/es/shell1 1 a 2 c abcd
執行結果:
$0=/home/es/shell1
1=1
$2=a
$*=1 a 2 c abcd
$@=1 a 2 c abcd
$#=5
$*
1
a
2
c
abcd
$@
1
a
2
c
abcd
*
1 a 2 c abcd
@
1
a
2
c
abcd
觀察可以看到"$@"會分成每個詞處理,而"$*"則是當成整個詞處理
2.shift指令
左移1位操作,如上面的引數1 a 2 c abcd,左移後1就沒了變為a 2 c abcd
例子:
#!/bin/bash
echo '$0='$0
echo "$1="$1
echo "\$2="$2
echo "\$*="$*
echo "\$@="$@
echo "\$#="$#
shift
echo "\$*="$*
echo "\$@="$@
echo "\$#="$#
執行:[root@VM_0_16_centos es]# /home/es/shell2 1 a 2 b abcd
執行結果:
$0=/home/es/shell2
1=1
$2=a
$*=1 a 2 b abcd
$@=1 a 2 b abcd
$#=5
$*=a 2 b abcd
$@=a 2 b abcd
$#=4
3.預定義變數
$? 執行上一個命令的返回值,執行成功,返回0,執行失敗,返回非0(具體數字由命令決定)
$$ 當前程式的程式號(PID),即當前指令碼執行時生產的程式號
$! 後臺執行的最後一個程式的程式號(PID),最近一個被放入後臺執行的程式 加上&
例子:
#!/bin/bash
pwd
echo "\$$="$$
#放到後臺執行,並將結果放到dev/null中
ls /etc >/dev/null &
echo "\$!="$!
執行:bash shell3
執行結果:
/home/es
$$=20080
$!=20081
20080是前臺程式號
20081是後臺程式號
其中,例子中的/dev/null是一個空洞
例子2:
控制檯中執行:nohup ls /etc/ &
執行結果
[root@VM_0_16_centos es]# nohup ls /etc/ &
[1] 20221
[root@VM_0_16_centos es]# nohup: ignoring input and appending output to ‘nohup.out’
[1]+ Done nohup ls /etc/
[root@VM_0_16_centos es]#
執行ll檢視檔案:
[root@VM_0_16_centos es]# ll
total 44
-rwxr-xr-x 1 root root 18 May 10 14:44 firstshell
-rw-r--r-- 1 es root 136 May 9 09:28 hello2.txt.tar.gz
-rwxrwxrwx 1 es es 156 May 9 12:38 hello.txt
-rw-rw-r-- 1 es es 136 May 8 19:21 hello.txt.tar.gz
-rw-rw-r-- 1 es es 182 May 8 19:12 hello.txt.zip
-rw------- 1 root root 2140 May 11 09:49 nohup.out
-rwxr-xr-x 1 root root 255 May 11 09:16 shell1
-rwxr-xr-x 1 root root 146 May 11 09:39 shell2
-rw-r--r-- 1 root root 117 May 11 09:46 shell3
drwxr-xr-x 2 es es 4096 May 9 09:32 temp
drwxr-xr-x 2 root root 4096 May 8 19:10 tody
可以看到一個nohup.out檔案,cat一下:
[root@VM_0_16_centos es]# cat nohup.out
acpi
adjtime
aliases
alternatives
anacrontab
asound.conf
at.deny
audisp
audit
avahi
bash_completion.d
bashrc
binfmt.d
centos-release
centos-release-upstream
chkconfig.d
chrony.conf
chrony.keys
cifs-utils
cloud
containers
省略n行
這裡面是什麼呢?就是ls /etc/的執行結果,nohup將命令執行的結果放到了當前目錄的nohup.out檔案中了。
例子3:$?
執行pwd
然後執行echo $?
[root@VM_0_16_centos es]# pwd
/home/es
[root@VM_0_16_centos es]# echo $?
0
執行結果0表示上一條命令執行成功
例子4:執行時沒有許可權,$?返回126
[root@VM_0_16_centos es]# ./secondshell
-bash: ./secondshell: Permission denied
[root@VM_0_16_centos es]# echo $?
126
[root@VM_0_16_centos es]#
還可以合併成一條語句:
[root@VM_0_16_centos ~]# pwd ;echo $?
/root
0
;不管前面是否執行成功,都會執行;後面的語句
&&前面執行成功了才會執行後面的語句,否則不執行後面的語句命令。
[root@VM_0_16_centos ~]# wdd && echo $?
-bash: wdd: command not found
[root@VM_0_16_centos ~]#
[root@VM_0_16_centos ~]# pwd && echo $?
/root
0
相關文章
- 01 shell程式設計之變數定義程式設計變數
- shell程式設計02——變數定義與使用程式設計變數
- Shell程式設計-shell變數1程式設計變數
- Shell程式設計-02-Shell變數程式設計變數
- shell程式設計–bash變數程式設計變數
- shell程式設計(一)變數程式設計變數
- shell程式設計-高階變數程式設計變數
- Shell程式設計-04-Shell中變數數值計算程式設計變數
- Shell 變數變數
- Shell變數變數
- 『忘了再學』Shell基礎 — 17、預定義變數變數
- shell程式設計–bash變數介紹程式設計變數
- Shell程式設計規範與變數程式設計變數
- linux基礎——shell變數(本地變數和環境變數)Linux變數
- Shell--變數變數
- shell Bash變數變數
- (2) Shell 變數變數
- Shell常用的特殊位置引數變數說明變數
- 01 shell程式設計規範與變數程式設計變數
- Linux Shell程式設計(10)——引用變數Linux程式設計變數
- Shell階段02 shell變數運算(整數運算/小數運算), shell變數案例變數
- Shell入門——shell特性、變數變數
- 『忘了再學』Shell基礎 — 16、位置引數變數變數
- 2.Shell變數變數
- Shell 變數學習變數
- Linux Shell變數Linux變數
- [shell基礎]——變數變數
- awk引用shell變數變數
- awk使用shell變數變數
- Linux Shell程式設計(6)——變數替換Linux程式設計變數
- Linux Shell程式設計(7)——變數賦值Linux程式設計變數賦值
- Linux Shell程式設計(8)——變數詳解Linux程式設計變數
- Linux Shell程式設計(14)——內部變數Linux程式設計變數
- shell基礎篇(二)-shell變數變數
- [Shell] shell中的內部變數變數
- shell程式設計學習筆記(二):Shell中變數的使用程式設計筆記變數
- Shell變數型別有哪些?linux運維shell程式設計變數型別Linux運維程式設計
- Shell轉義字元與變數替換字元變數