位置参数说明
位置参数变量 | 说明 |
$n | n为自然数。0代表命令本身,0代表命令本身,1到9代表第1到第9个参数(参数的值是执行该命令时,从9代表第1到第9个参数(参数的值是执行该命令时,从1开始依次输入的),十以上的参数要用大括号包含,如${10}。 |
$* | 这个变量代表命令行中所有的参数(不包括$0),它把所有的参数当做一个整体对待。对其进行for循环遍历时,只会循环一次 |
$@ | 这个变量也代表命令行中所有的参数(不包括$0),它把所有的参数当做独立的个体对待。对其进行for循环遍历时,可循环多次。 |
$# | 这个变量代表命令行中所有参数的个数(不包括$0)。 |
位置参数变量的名称和作用都是固定的,但我们可以给其传入不同的值。
位置参数变量的作用是接收用户执行命令时传入的参数以及命令本身。
位置参数变量主要用在shell脚本文件中,那么它的作用就是把命令和命令的参数传递到当前执行的脚本中
下面通过编写一个shell脚本文件canshu.sh,并执行它来说明。
vi canshu.sh
canshu.sh的内容如下
#!/bin/bash
echo $0
echo "\$1 is $1"
echo "\$2 is $2"
for x in "$*"
do
echo $x
done
for y in "$@"
do
echo $y
done
echo $#
执行该脚本,并传递两个参数 ./canshu a b
[root@localhost 12:41 ~/sh]# ./canshu.sh a b
./canshu.sh
$1 is a
$2 is b
a b
a
b
2
总结: 使用位置参数变量来接收用户输入的参数,有一个弊端是,除非脚本是你自己写的,否则执行脚本时,你根本不知道要传入几个什么样的参数。好处是在执行脚本的同时传入参数。
预定义变量
$0 | 保存当前进程或脚本的名称 |
$! | 后台运行的最后一个进程的PID号 |
$? | 表示程序退出时的代表(0表示执行成功,非0表示执行失败) |
$* | 代表所有的参数内容 |
$$ | 代表当前进程的ID号码 |
$# | 代表当前shell的参数个数 |
$@ | 代表所有的参数内容 逐个读取 |
用法示例
vi test.sh
vi test.sh
#!/bin/bash
#This is a test csript
#2018/4/8
echo "script name:"$0
echo "all parameters:"$*
echo "PID of the script:"$$
echo "success of the previous command:"$?
带入参数运行,如下结果
[root@localhost ~]# ./test.sh 11 22 33
script name:./test.sh
all parameters:11 22 33
PID of the script:3177
success of the previous command:0
自定义变量
- 变量没有具体的数据类型,因此在定义变量时可以不必定义其类型,直接赋值就可使用(javascript同样 var)
- 如果value没有指定,则会把变量赋值为空字符串
- 变量定义好后使用($变量名)来调用变量的值
- 变量等号两边不能有空格
- 当变量内ROM和有特殊字符(如空格),需要加上单引号
- 变量对大小写敏感
示例
[root@localhost ~]# x=3
[root@localhost ~]# y=4
[root@localhost ~]# echo $((x+y))
7
同理于 expr arg1 + arg2;
shell循环控制脚本示例
[root@localhost ~]# cat for.sh
#!/bin/bash
#使用for循环打印1-10
for i in 1 2 3 4 5 6 7 8 9 10
do
echo $i
done
for((j=1;j<11;j++))
do
echo $j
done
for((x=1;x<11;x++))
do
sum=$((sum+x))
done
echo $sum
结果为打印1-10,求和sun=55;
下面为简单的求1-100中偶数的和
#!/bin/bash
sum=0
flag=0
for((y=1;y<101;y++))
do
temp=$((y%2))
if [[ "$temp" -eq "$flag" ]];then
sum=$((sum+y))
fi
done
echo "sum="$sum
为了容易理解,将判断步骤分成了三步进行分解,结果为sum=2550,依也可以写成如下格式
#!/bin/bash
for((y=1;y<101;y++))
do
if [[ "$y % 2" -eq "0" ]];then
sum=$((sum+y))
fi
done
echo "sum="$sum
case示例如下
#!/bin/bash
#判断一个输入的字符是否为字母或者数字
#并输出相应的其他信息
num=1
read -p "press some key,then press return:" key
case $key in
[a-z]|[A-Z])
echo "it is a letter"
;;
[1-9])
echo "it is a number"
;;
*)
echo "it is a function key"
esac
case 示例2