Shell编程-shell变量2-位置变量和预定义变量

10 篇文章 0 订阅
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
















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值