Shell变量 预定义变量和位置参数变量

预定义变量

预定义变量 作用
$? 最后一次执行命令的返回状态。如果正确执行,则返回0;如果返回为非零(具体数值由命令决定),则上一条命令执行不正确
$$ 返回当前进程的PID
$! 返回后台运行的最后一个进程的PID
1
2
3
4
5
6
7
ls || echo yes
ls qwe && echo no
前面一条语句正确执行,才执行后一条语句。这里就是通过执行命令的返回值来判断的
echo $?
echo $$ #直接打印返回的是/bin/bash,需要时可以放到shell脚本里
echo $!

可以通过一个简单的shell来展示一下

1
2
3
4
5
#!/bin/bash
ehco "dang qian de PID: $$"
find / hello.sh &
echo "hou tai de PID: $!"


位置参数变量

位置参数变量本质上还是预定义变量

位置参数变量 作用
$n n 为数字,$0 代表命令本身,$1-$9 代表第一到第九个参数,十以上的参数需要用大括号包含,如 ${10}
$* 这个变量代表命令行中所有的参数,$* 把所有的参数看成一个整体
$@ 这个变量也代表命令行中所有的参数,不过 $@ 把每个参数区分对待
$# 这个变量代表命令行中所有参数的个数

例子1

1
2
3
4
5
6
7
#!/bin/bash
num1=$1
num2=$2
sum=$(($num1+$num2))
#变量 sum 的和是 num1 加 num2
echo $sum
#打印变量 sum 的值
1
2
#执行脚本
./test.sh 45 76

例子2

1
2
3
4
5
6
7
#!/bin/bash
echo "A total of $# parameters"
#使用 $# 代表所有参数的个数
echo "The parameters is:$*"
#使用 $* 代表所有的参数
echo "The parameters is:$@"
#使用 $@ 代表所有的参数
1
2
#执行脚本
./test.sh 11 22 33 44

例子3

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
for i in "$*"
# $* 中所有参数看成是一个整体,所以这个 for 循环只会循环一次
do
echo "The parameters is:$i"
done
for y in "$@"
# $@ 中每个参数都看成是独立的,所以 $@ 中有几个参数,就会循环几次
do
echo "Parameter:$y"
done


接收键盘输入

1
2
3
4
5
6
read [选项] [变量名]
选项:
-p "提示信息":在等待read输入时,输出提示信息
-t 秒数:read命令会一直等待用户输入,使用此选项可以指定等待时间
-n 字符数:read命令只接受指定的字符数,就会执行
-s:隐藏输入的数据,适用于机密信息的输入,比如密码

read.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
read -p "please input your name:" -t 30 name
echo $name
#如果超过30秒不输入,就终止当前命令
read -p "please input your passwd:" -s passwd
echo -e "\n"
echo $passwd
#输入的值是隐藏的,看不见的,但是在sh里面还是可以获取到的,并且可以输出的
read -p "please input your sex [M/F]:" sex
echo -e "\n"
echo $sex
#只能输入一个字符,且输入之后立马执行