Shell程式設計-shell變數2-位置變數和預定義變數

一枚程式設計師發表於2018-05-11
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
















相關文章