在linux中可以通过help命令查看if的格式
[root@CentOS6 shell]# help ifif: if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi
解释: if 后面跟命令 ; then 如果命令成立,在这里可以在执行命令; [还可以写多个 elif 语句] [最后也可以写 else 语句] 最终以 fi 结束if语句
代码示例:
打印当前目录,如果正确输出打印ok 如果错误输出 打印error[root@CentOS6 shell]# if ls ./; then echo ok; else echo error; fi\ adduser.sh exporttest.sh test.shok
如果不想让 ls命令的结果输出到控制台上,可以重定向所有的输出流到 /dev/null[root@CentOS6 shell]# if ls ./ &> /dev/null; then echo ok; else echo error; fiok
条件表达式使用 : test 或者 [ [root@CentOS6 shell]# if [ 2 -eq 3 ]; then echo yes; else echo no; fino
[root@CentOS6 shell]# help forfor: for NAME [in WORDS ... ] ; do COMMANDS; done
for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done
for的格式有两种: 第一种类似于java中的增强for循环 第二种类似于java中的普通for循环
示例:[root@CentOS6 shell]# for i in "upuptop" "趣学程序" "pyfysf" ; do echo $i; doneupuptop趣学程序pyfysf
[root@CentOS6 shell]# for(( i = 0; i<=5; i++ )); do echo $i; done012345
[root@CentOS6 shell]# help whilewhile: while COMMANDS; do COMMANDS; done
示例:[root@CentOS6 shell]# mkdir /upuptop[root@CentOS6 shell]# while ls /upuptop &> /dev/null; do echo ok; rm -rf /upuptop; doneok
上述命令:执行ls /upuptop命令,结果为0,则打印ok,删除/upuptop目录。再次执行 ls /upuptop ,结果非0.终止循环。如果不加rm -rf /upuptop 则是死循环
bash最终的扩展是切割扩展,其通过一个环境变量
IFS
里面定义的分隔符进行分割。默认为空格,制表符,换行符。IFS
的定义是放的三个标识符的ASCII码,例如:我们可以通过$"\n"获去换行符的码值 在脚本中,如果你修改了用完之后一定要记得改回去 可以使用awk
命令切割字符串
1.用户自定义路径2.输出文件带下最大的文件3.递归子目录
[root@CentOS6 shell]# vim maxFile.sh#!/bin/bash
# 备份$IFSoldIFS=$IFS
# 设置IFS的切割只为换行符IFS=$'\n'
# 循环遍历指定参数目录下的所有文件和目录for i in `du -a $1 | sort -nr` ; do
# 此时 $i=4 ./adduser.sh 对文件进行切割 fileName=$(echo $i | awk '{print $2}')# echo $fileName # 判断仅仅是文件的数据 if [ -f $fileName ]; then
# 打印文件名 echo $fileName exit 0
fidone
# 复原IFSIFS=$oldIFSecho "not find ..."exit 2
[root@CentOS6 shell]# chmod +x maxFile.sh [root@CentOS6 shell]# ./maxFile.sh ./1.jpg
# 定义一个计数器num# 打印num正好是文件行数
[root@CentOS6 shell]# vim a.txt[root@CentOS6 shell]# cat a.txt a 1b 2c 3
shell脚本:
[root@CentOS6 shell]# vim readFile.sh
#!/bin/bash
# 第一种方式:使用for..in,加cat命令# 备份IFSoldIFS=$IFSIFS=$'\n'
num=0
for i in `cat a.txt`; do echo $i ((num++))doneecho fun1:num:$num
IFS=$oldIFS
# 第二方式:使用管道 普通for循环实现
num=0
# 获取行数lines=`cat a.txt | wc -l`
for ((i=1; i<= lines; i++));do head -$i a.txt | tail -1 ((num++))doneecho fun2: num:$num
# 第三种方式 IO重定向
# 备份0输入流exec 8>&0# 将标准输入指向a.txtexec 0< a.txtnum=0
# read命令默认读取标准输入0 中的内容 遇见换行符结束while read line;do echo $line ((num++))done
echo fun3: num:$num# 复原0exec 0<&8
# 第四种方式 第三种的简化
num=0
while read line ; do
echo $line ((num++))done 0< a.txt
echo fun4:num:$num
# 第五种方式 使用管道为while读取 注意子进程计数处理# 由于管道会开启左侧与右侧的子进程执行程序,所以这里使用保存文件来计数export num=0rm -rf tempnumcat a.txt | while read line; do echo $line if [ -f tempnum ]; then # 获取之前存在的值 nn=`head -1 tempnum`
echo $((nn+1)) > tempnum else echo 1 > tempnum fi
done
echo fun5:$(cat tempnum)
[root@CentOS6 shell]# chmod +x readFile.sh[root@CentOS6 shell]# ./readFile.sh