shell脚本编程部分技巧总结
今天看脚本,发现有好多不懂的地方,于是查找资料,总结了一下。
1、
${var:-word} //如果var定义了,就使用var,如果没有定义,则使用后面word的值
如:下面的脚本,如果输入,则显示输入的信息.如果不输入直接回车,则显示abc、但是这时候INT的值仍然是空的。
#!/bin/bash
read -p "please input the word: " INT
A=${INT:-abc}
echo $INT
echo $A
此时输入hello则显示
hello
此时如果直接点回车
//空
abc
2、
${var:+word} //如果var定义了,就使用word这个值,如果没有定义,则显示为空
A=${INT:+abc}
此时如果输入hello
此时如果不输入直接回车
//空
3、
${var:=word} //这时候如果输入,则显示输入的信息;如果不输入则显示abc,这时候INT的值被赋值为abc。
A=${INT:=abc}
如果输入hello则输出结果为
如果不输入直接回车
abc //此时INT被赋值为abc
4、
${INT:?error} //此时如果输入则显示输入信息,如果不输入,则显示错误信息并退出程序。
A=${INT:?error}
如果输入hello则显示
则输出错误信息。并推出
5、
函数的变量类型,局部和全局变量。
如
#!/bin/bash
A=3 //此时定义的A=3是全局变量,在整个脚本中有效
FUN() {
local A=6 //此时定义本地变量A=6只在函数内部有效
A=$[$A+1]
echo "it's: $A"
}
FUN
输出结果为
it's:7
3
declare -i A=2同样可以说明A是×××且A=2
declare -r B=3变量为3且不能撤销
declare -x 声明一个变量为环境变量
6、
如,截取字符串
FILENAME='/var/log/maillog'
echo ${FILENAME#*/}
echo ${FILENAME##*/}
echo ${FILENAME%/*}
echo ${FILENAME%%/*}
显示的结果为
var/log/maillog
maillog
/var/log
不多解释,自己体会一下就会明白
7、
数组
定义数组
declare -a A
初始化数组的几种方式
1、单独赋值
names[1]=alice
names[0]=hatter
names[2]=duchess
names=([2]=duchess [1]=alice [0]=hatter) //小括号里面值与值中间有空格
names=(alice hatter duchess)
names=(alice [5]=hatter duchess) //表示此数组有7个值,第1,2,3,4的值没有定义
如:这里写一个脚本,数组里面是/var下的文件名,现在我想随机取才出里面的几个文件名。
read -p "please input the number you want to choice: " NOM
declare -i I=0
for FILE in `ls /var`;do
FILENAME[$I]=$FILE //给数组赋值
let I++
done
echo ${FILENAME[*]} //这两行是显示数组的值,不同的用法
echo ${FILENAME[@]}
echo ${#FILENAME[*]} //下两行是统计个数
echo ${#FILENAME[*]}
declare A=1
while [ $A -le $NOM ]; do
INDEX=$[$RANDOM%20] //这里的20是对20取模
let A++
echo ${FILENAME[$INDEX]}
当你执行此脚本的时候就会把所有的文件名输出2次,并输出2次文件的个数。并输出你输入的数字所随机选择的文件的名字。
如,你们班级有26位同学,每次上课要随机取几名来提问。