Shell编程-shell变量2-位置变量和预定义变量
日期: 2018-05-11 分类: 个人收藏 358次阅读
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
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
上一篇: XSS————1、XSS测试平台搭建
下一篇: 微服务架构——什么是微服务?
精华推荐