1. shell脚本调试
shell脚本调试无需任何额外的工具,只需要要在脚本文件前加-x选项即可
[root@cqk ~]# sh -x debug.sh
+ echo hello
hello
+ echo word
word
+ ls +
ls: 无法访问+: 没有那个文件或目录
-x选项将shell脚本每一行命令及执行结果打印输出,如此便能帮助开发人员快速定位到出错的脚本位置。如果代码量比较大或者脚本开发人员知道代码出错的大致位置,则可以使用set -x; set +x;命令进行局部调试,如
for i in {1..6}
do
set -x //表示跟在该命令后的脚本输出调试信息
echo $i
set +x//表示从此处禁用调试
done
echo "调用"
[root@cqk ~]# sh debug.sh
+ echo 1
1
+ set +x
+ echo 2
2
+ set +x
+ echo 3
3
+ set +x
+ echo 4
4
+ set +x
+ echo 5
5
+ set +x
+ echo 6
6
+ set +x
调用
2.shell函数
vi fun.sh
#!/bin/bash
function name(){
echo $1
echo $0
echo $@
}
name "one" "two"
[root@cqk ~]# sh fun.sh
one
fun.sh
one two
3. shell控制结构初步
3.1for循环
(1)for i in $(seq 10)
#!/bin/bash
for i in $(seq 10)
do
echo $i
done
[root@cqk ~]# sh forloop.sh
1
2
3
4
5
6
7
8
9
10
(2) for((i=1;i<=10;i++))
for((i=1;i<=10;i++))
do
echo $i
done
(3)for i in ls
for i in `ls`
do
echo $i
done
[root@cqk ~]# sh forloop2.sh
debug.sh
forloop1.sh
forloop2.sh
forloop.sh
fun.sh
output.txt
readme.txt
shellError.txt
shell.txt
test.sh
(4)for i in ${arr[*]}
#!/bin/bash
arr=(0 1 2 3 4 5 6)
for i in ${arr[*]}
do
echo ${arr[i]}
done
[root@cqk ~]# sh forloop3.sh
0
1
2
3
4
5
6
3.2while循环控制结构
(1)计数器格式
适用于循环次数已知或固定时
#!/bin/bash
i=1
while(($i<5))
do
echo $i
let i++
done
[root@cqk ~]# sh whileloop.sh
1
2
3
4
(2)标志符结束while循环
#!/bin/bash
echo "num (1~~10): "
read num
while [[ $num != 4 ]]
do
if [ $num -lt 4 ]
then
echo "小"
read num
elif [ $num -gt 4 ]
then
echo "大"
read num
else
exit 0
fi
done
echo "正确"
[root@cqk ~]# sh whileloop1.sh
num (1~~10):
1
小
2
小
8
大
5
大
4
正确
3.3 if条件判断
注意点
1.if与[之间要有空格
2.[]与判断条件之间也必须有空格
3.]与;之间不能有空格
(1)对字符串判断
1.if [ str1 = str2 ];then fi ----当两个字符串相同时返回真
2.if [ str1 != str2 ];then fi ----当两个字符串不相等时返回真
3.if [ -n str1 ];then fi ----当字符串的长度大于0时返回真 (判断变量是否有值)
4.if [ -z str1 ];then fi ----当字符串的长度为0时返回真
#!/bin/bash
str1="hello"
str2="iell"
if [ str1 = str2 ]
then
echo "相等"
fi
if [ str1 != str2 ]
then echo "不相等"
fi
if [ -n str1 ]
then
echo "str1大于0"
fi
if [ -z str1 ]
then
echo "str1长度不是0"
(2)判断数字
1.int1 -eq int2 --相等
2.int1 -ne int2 --不相等
3.int1 -gt int2 --大于
4.int1 -ge int2 --大于等于
5.int1 -lt int2 --小于
6.int1 -le int2 --小于等于
#!/bin/bash
m=2
n=3
if [ $m -lt $n ]
then
echo "小于"
fi
if [ $m -gt $n ]
then
echo "大于"
fi
[root@cqk ~]# sh ifloop1.sh
小于
(3)判断文件
1. -r file --用户可读为真
2. -w file --用户可写为真
3. -x file --用户可执行为真
4. -f file --文件存在且为正规文件为真
5. -d file --如果是存在目录为真
6. -c file --文件存在且为字符设备文件
7. -b file --文件存在且为块设备文件
8. -s file --文件大小为非0为真,可以判断文件是否为空
9. -e file --如果文件存在为真
#!/bin/bash
if [ -f ifloop.sh ]
then
echo "文件存在"
fi
[root@cqk ~]# sh ifloop2.sh
文件存在
(4)逻辑判断
1. -a --与
2. -o --或
3. ! --非
3.4 until循环控制结构
#!/bin/bash
i=0
until [ $i -gt 2 ]
do
let i+=1
echo "i=$i"
done
[root@cqk ~]# sh until.sh
i=1
i=2
i=3
4. read命令
-a :将内容读入到数值中
read命令在shell脚本中很重要,学用这个命令来接受用户输入
-d : 表示delimiter,即定界符,一般情况下是以IFS为参数的间隔,但是通过-d,我们可以定义一直读到出现执行的字符位置。例如read –d madfds value,读到有m的字符的时候就不在继续向后读,例如输入为 hello m,有效值为“hello”,请注意m前面的空格等会被删除。这种方式可以输入多个字符串,例如定义“.”作为结符号等等。
-e :只用于互相交互的脚本,它将readline用于收集输入行。读到这几句话不太明白什么意思,先跳过。
-n : 用于限定最多可以有多少字符可以作为有效读入。例如echo –n 4 value1 value2,如果我们试图输入12 34,则只有前面有效的12 3,作为输入,实际上在你输入第4个字符‘3’后,就自动结束输入。这里结果是value为12,value2为3。
-p :用于给出提示符,在前面的例子中我们使用了echo –n “…“来给出提示符,可以使用read –p ‘… my promt?’value的方式只需一个语句来表示。
-r :在参数输入中,我们可以使用’/’表示没有输入完,换行继续输入,如果我们需要行最后的’/’作为有效的字符,可以通过-r来进行。此外在输入字符中,我们希望/n这类特殊字符生效,也应采用-r选项。
-s : 对于一些特殊的符号,例如箭头号,不将他们在terminal上打印,例如read –s key,我们按光标,在回车之后,如果我们要求显示,即echo,光标向上,如果不使用-s,在输入的时候,输入处显示^[[A,即在terminal上 打印,之后如果要求echo,光标会上移。
-t :用于表示等待输入的时间,单位为秒,等待时间超过,将继续执行后面的脚本,注意不作为null输入,参数将保留原有的值
5.分割语法
#!/bin/bash
str="a,s,d,f,g,h,j,k,l"
OLD_IFS="$IFS"
IFS=","
arr=($str)
IFS="$OLD_IFS"
for x in ${arr[*]}
do
echo $x
done
echo "---------"
arr2=(${str//,/})
for x in ${arr2[*]}
do
echo $x
done
[root@cqk ~]# sh split.sh
a
s
d
f
g
h
j
k
l