13.Linux shell编程(条件语句和标准输出重定向)

简介: (创建于2018/1/31)条件语句shell中的条件语句必须以fi结尾,否则会报错syntax error: unexpected end of fileif else then 这里的test命令意思就是test后的条件如果成立,则它就是0(...

(创建于2018/1/31)

条件语句

shell中的条件语句必须以fi结尾,否则会报错syntax error: unexpected end of file

if else then 这里的test命令意思就是test后的条件如果成立,则它就是0(真),否则就是非零(假)

 #!/bin/bash
  2 
  3 var=""
  4 if test var                                                                        
  5 then 
  6 echo "success"
  7 else
  8 echo "failed"
  9 fi

if then elif then fi(相当于if else if语句)

  1 #!/bin/bash                                                                        
  2 
  3 if test $var
  4 then echo "success"
  5 elif test haha
  6 then echo "haha"
  7 else echo "failed"
  8 fi

条件语句进行数字大小比较
-gt表示数学中的大于号>
其他符号的对应关系为
-eq:等于
-lt : 小于
-ne :不等于
-le :小于等于

 1 #!/bin/bash                                                                        
  2 
  3 a=10
  4 b=5
  5 
  6 if [ $a -gt $b ]      //注意,[]中间一定有空格,否则会报错 command not found
  7 then
  8         echo "$a is greater than $b"
  9 else
 10         echo "$a is smaller than $b"
 11 fi

字符串的比较

str1 == str2
str1 != str2
str1 < str2
-n str1 长度是否非零
-z str2 长度是否为0

  1 #!/bin/bash
  2 
  3 str1="ren"
  4 str2="ming"
  5 str3=""
  6 str4="ren"
  7 
  8 if [ $str1 == $str4 ]                                                              
  9 then
 10         echo " str1 == str2"
 11 else
 12         echo " str1 != str2"
 13 fi
检查文件或者目录

-d : 检查目录是否存在
-f : 检查文件是否存在
-e : 检查文件或者目录是否存在
-r : 检查是否存在并且可读
-w : 检查是否存在并且可写
-x : 检查是否存在并且可执行
file1 -nt file2 file1比file2新(new than)
file1 -ot file2 file1比file2旧 (old than)

查看一个目录是否存在,如果存在则遍历这个目录

   1 #!/bin/bash                                                                        
  2 
  3 dir=/usr/ndk/temp
  4 
  5 if [ -d $dir ]
  6 then
  7         echo "$dir exist"
  8         cd $dir
  9         ls
 10 else
 11         echo "$dir not exist"
 12 fi

多个条件组合

如果目录存在和文件ren.sh可执行满足,则打印,遍历dir并创建一个文件b.sh并授权可执行然后再次遍历

  1 #!/bin/bash                                                                        
  2 
  3 dir=/usr/ndk/temp
  4 
  5 dir2=/usr/ndk/temp/ren.sh
  6 
  7 if [ -d $dir ] && [ -x $dir2 ]
  8 then
  9         echo "find $dir and $dir2,$dir2 can be execute"
 10         ls $dir
 11         touch b.sh
 12         chmod u+x b.sh
 13         ls -la
 14 else
 15         echo "not exist"
 16 fi


  tabstop=8root@iZuf67sz57humoriy3o6oiZ:/usr/ndk/temp# ./a.sh 
find /usr/ndk/temp and /usr/ndk/temp/ren.sh,/usr/ndk/temp/ren.sh can be execute
a.sh  ren.sh
total 16
d--------- 2 root root 4096 Sep 13 07:57 .
drwxrwxrwx 7 root root 4096 Sep  7 07:47 ..
-rwxr--r-- 1 root root  215 Sep 13 07:57 a.sh
-rwxr--r-- 1 root root    0 Sep 13 07:57 b.sh
-rwxr--r-- 1 root root  115 Sep 13 07:34 ren.sh
shell中的case命令(类似switch)

格式如下:
case 变量 in
pattern1) 命令;;
pattern2) 命令;;
*) 默认命令;;
esac

  1 #!/bin/bash                                                                        
  2 
  3 user=zhen
  4 
  5 case $user in
  6 
  7 zhen)
  8         echo "zhen is here";;
  9 ming)
 10         echo "ming is here";;
 11 *)
 12         echo "not found";;
 13 esac

shell中的for命令

1 #!/bin/bash
  2 
  3 list="Monday,Friday,Sonday"
  4 IFS=$,          //域分隔符                                                                   
  5 for item in $list
  6 do
  7         echo $item
  8 done
  9 

打印结果去掉了括号
  tabstop=8root@iZuf67sz57humoriy3o6oiZ:/usr/ndk/temp# ./c.sh 
Monday
Friday
Sonday
shell中的while命令
  1 #!/bin/bash                                                                        
  2 
  3 a=10
  4 while [ $a -gt 0 ]
  5 
  6 do
  7         echo "num:$a"
  8         a=$[ $a - 1 ]
  9 done

tabstop=8root@iZuf67sz57humoriy3o6oiZ:/usr/ndk/temp# ./d.sh 
num:10
num:9
num:8
num:7
num:6
num:5
num:4
num:3
num:2
num:1
root@iZuf67sz57humoriy3o6oiZ:/usr/ndk/temp# 

循环语句和条件语句嵌套

  1 #!/bin/bash                                                                        
  2 
  3 a=10
  4 while [ $a -gt 0 ]
  5 
  6 do
  7         echo "num:$a"
  8         a=$[ $a - 1 ]
  9         if [ $a -eq 5 ]
 10         then
 11                 echo "break"
 12                 break
 13         fi
 14 done

  tabstop=8root@iZuf67sz57humoriy3o6oiZ:/usr/ndk/temp# ./d.sh 
num:10
num:9
num:8
num:7
num:6
break
root@iZuf67sz57humoriy3o6oiZ:/usr/ndk/temp#

重定向深入理解undefined

一般情况下,每一个Linux 命令运行时都会打开三个文件:
标准输入文件(stdin): stdin的文件描述符为0,linux程序默认从stdin读取数据。
标准输出文件(stdout): stdout 的文件描述为1,linux程序默认向stdout输出数据。
标准错误文件(stderr): stderr 的文件描述符为2,linux程序会向stderr流中写入错误信息。

以后打开文件后。新增文件绑定描述符 可以依次增加。 一条shell命令执行,都会继承父进程的文件描述符。因此,所有运行的shell命令,都会有默认3个文件描述符。
正常情况下,command > file 将stdout重定向file,command < file 将stdin 重定向到 file。
一个命令执行了:
先有一个输入:输入可以从键盘,也可以从文件得到
命令执行完成:成功了,会把成功结果输出到屏幕:standard output默认是屏幕
命令执行有错误:会把错误也输出到屏幕上面:standard error默认也是指的屏幕
如果希望stderr 重定向 到file 可以这样写:

command 2> file
1

如果希望stderr追加到file 文件末尾,可以这样写:

command 2>> file

1.输出内容到文件中,(如果文件不存在则自动创建)

#!/bin/bash                                                                              

file=test111
echo "input into test111" > $file
echo "input into test111" >> $file  (追加到文件末尾)

打开文件test111会发现结果,输入了两行
input into test111
input into test111

2.输出到屏幕上(控制台)

 #!/bin/bash                                                                              

file=test111

//0 STDIN
//1 STDOUT  标准输出
//2 STDERR

echo "input into test111" >&2    //注意,>与&2之间没有空格
echo "input into test111" >&2    //>>无法输出到屏幕

3.在命令行中控制标准输出重定向到文件中

command > file  将输出重定向到 file。
command < file  将输入重定向到 file。
command >> file     将输出以追加的方式重定向到 file。
n > file    将文件描述符为 n 的文件重定向到 file。
n >> file   将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m  将输出文件 m 和 n 合并。
n <& m  将输入文件 m 和 n 合并。
<< tag  将开始标记 tag 和结束标记 tag 之间的内容作为输入。
需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。

command1 < infile > outfile   //执行command1,从文件infile读取内容,然后将输出写入到outfile中
#!/bin/bash                                                                              

file=test111
echo "input into test111"
echo "input into test111"
    
//./14.sh &> test222  也可以输出到文件中,搞不懂
执行脚本

tabstop=8root@iZbp11v3y27wpf6mglp2glZ:/user/renzhenming/shell# ./14.sh 1> test222   //(将文件描述符为 n 的文件重定向到 file。)会将标准输出符为1的文件14.sh中的标准输出内容重定向到test222文件中,注意任何test222内的已经存在的内容将被新内容替代。如果要将新的内容添加到文件的末尾,则使用>>操作符。
root@iZbp11v3y27wpf6mglp2glZ:/user/renzhenming/shell# ls
10.sh  12.sh  14.sh  3.sh  5.sh  7.sh  9.sh  ren.txt  test222
11.sh  13.sh  2.sh   4.sh  6.sh  8.sh  copy  test111
root@iZbp11v3y27wpf6mglp2glZ:/user/renzhenming/shell# cat test222
input into test111
input into test111

4.在脚本中设置标准输出重定向写入文件中,exec 1>文件名

#!/bin/bash                                                                              

exec 1>test333
echo "input into test333"
echo "input into test333"
      
      
输出结果:

./14.sh
root@iZbp11v3y27wpf6mglp2glZ:/user/renzhenming/shell# ls
10.sh  12.sh  14.sh  3.sh  5.sh  7.sh  9.sh  ren.txt  test222
11.sh  13.sh  2.sh   4.sh  6.sh  8.sh  copy  test111  test333
root@iZbp11v3y27wpf6mglp2glZ:/user/renzhenming/shell# cat test333 


  1 #!/bin/bash                                                                        
  2 
  //将标准输出重定向到output.txt文件中,这样一来这个脚本中的所有输出内容会
  //被打印到output.txt文件
  3 exec 1>output.txt
  //将标准错误输出重定向到error.txt文件,所以这个文件中发生的错误信息会被打印
  //到这里
  4 exec 2>error.txt
  5 
  6 echo "this is output"
  7 ls -la ffmpeg

5.自定义输出

#!/bin/bash   

//#0 STDIN    标准输入
//#1 STDOUT   标准输出
//#STDERR     标准错误

exec 1>file1      //将脚本执行过程中的标准输出写入到文件file1
exec 2>file2      //将脚本执行中的标准错误输出到文件file2

exec 3>file3      //自定义输出将标准输出输入到文件file3
echo "hello" >&3
echo "byebye"
ls -a ./hehe      //没有这个文件,发生错误,会将错误信息打印到file2中
    
    
结果:

tabstop=8root@iZbp11v3y27wpf6mglp2glZ:/user/renzhenming/shell# ./15.sh 
root@iZbp11v3y27wpf6mglp2glZ:/user/renzhenming/shell# ls
10.sh  12.sh  14.sh  2.sh  4.sh  6.sh  8.sh  copy         ren.txt  STDOUT
11.sh  13.sh  15.sh  3.sh  5.sh  7.sh  9.sh  CUSTOME_STD  STDERR
root@iZbp11v3y27wpf6mglp2glZ:/user/renzhenming/shell# cat STDOUT 
byebye
root@iZbp11v3y27wpf6mglp2glZ:/user/renzhenming/shell# cat STDERR 
ls: cannot access './hehe': No such file or directory
root@iZbp11v3y27wpf6mglp2glZ:/user/renzhenming/shell# cat CUSTOME_STD 
hello
相关文章
|
10天前
|
存储 Unix Shell
shell脚本编程基础
【9月更文挑战第4天】
26 12
|
9天前
|
Shell Linux
Shell 编程 编写hello word
Shell 编写hello word
31 5
|
14天前
|
项目管理 敏捷开发 开发框架
敏捷与瀑布的对决:解析Xamarin项目管理中如何运用敏捷方法提升开发效率并应对市场变化
【8月更文挑战第31天】在数字化时代,项目管理对软件开发至关重要,尤其是在跨平台框架 Xamarin 中。本文《Xamarin 项目管理:敏捷方法的应用》通过对比传统瀑布方法与敏捷方法,揭示敏捷在 Xamarin 项目中的优势。瀑布方法按线性顺序推进,适用于需求固定的小型项目;而敏捷方法如 Scrum 则强调迭代和增量开发,更适合需求多变、竞争激烈的环境。通过详细分析两种方法在 Xamarin 项目中的实际应用,本文展示了敏捷方法如何提高灵活性、适应性和开发效率,使其成为 Xamarin 项目成功的利器。
34 1
|
14天前
|
安全 Linux 开发工具
探索Linux操作系统:从命令行到脚本编程
【8月更文挑战第31天】在这篇文章中,我们将一起潜入Linux操作系统的海洋,从最基础的命令行操作开始,逐步深入到编写实用的脚本。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和实用技能。我们将通过实际代码示例,展示如何在日常工作中利用Linux的强大功能来简化任务和提高效率。准备好了吗?让我们一起开启这段旅程,探索Linux的奥秘吧!
|
23天前
|
Shell KVM 虚拟化
Shell 数组编程
【8月更文挑战第22天】 Shell 数组编程
39 10
|
28天前
|
存储 Unix Linux
Linux I/O 重定向与管道
【8月更文挑战第17天】重定向在Linux中改变命令I/O流向,默认有&quot;&gt;&quot;覆盖输出至文件及&quot;&gt;&gt;&quot;追加输出至文件末尾,便于保存结果;使用&quot;&lt;&quot;从文件读取输入而非键盘,高效处理数据。文件描述符如0(stdin)、1(stdout)、2(stderr)标识I/O资源,支持读写操作。管道以&quot;|&quot;连接命令,使前一命令输出成为后一命令输入,如排序用户或找出CPU占用最高的进程,构建复杂数据处理流程。
36 9
|
27天前
|
Linux 程序员 开发者
源社区的兴起:从“代码隐士”到Linux引领的“全球编程嘉年华”
在编程的古老森林中,曾有“代码隐士”默默耕耘,惧怕智慧外泄。直到“开源”春风拂过,源社区如全球编程嘉年华盛开!开源文化颠覆了“独门秘籍”的传统,像“武林秘籍共享”般在网络上公开,鼓励知识传播与智慧碰撞。程序员组队开发,分享代码,提升科技实力。Linux则从“首席大厨”变身为“总导演”,以强大内核调制出诱人应用,引领潮流并推动技术创新。加入这场没有血腥厮杀,只有知识盛宴的“编程版《饥饿游戏》”吧!与全球开发者共享编程的乐趣与成就感!别忘了带上你的“独门秘籍”,可能下一个改变世界的创意就在其中!
55 7
|
26天前
|
Shell 数据处理 C++
【震撼揭秘】Python正则VS Shell正则:一场跨越编程边界的史诗级对决!你绝不能错过的精彩较量,带你领略文本处理的极致魅力!
【8月更文挑战第19天】正则表达式是文本处理的强大工具,在Python与Shell中有广泛应用。两者虽语法各异,但仍共享许多基本元素,如`.`、`*`及`[]`等。Python通过`re`模块支持丰富的功能,如非捕获组及命名捕获组;而Shell则依赖`grep`、`sed`和`awk`等命令实现类似效果。尽管Python提供了更高级的特性和函数,Shell在处理文本文件方面仍有其独特优势。选择合适工具需根据具体需求和个人偏好决定。
23 1
|
1月前
|
存储 Unix Linux
Linux I/O 重定向与管道
【8月更文挑战第14天】输出重定向可将命令结果存入文件,如`&gt;`覆盖写入或`&gt;&gt;`追加写入。输入重定向从文件读取数据,如`&lt;`代替键盘输入。这些操作利用文件描述符(如0:stdin, 1:stdout, 2:stderr)管理I/O。管道`|`连接命令,使前一命令输出作为后一命令输入,便于数据处理,如排序用户`sort -t: -k3 -n /etc/passwd | head -3`或查找CPU占用高的进程`ps aux --sort=-%cpu | head -6`。
22 4
|
1月前
|
Unix Linux Shell
Linux I/O 重定向简介
Linux I/O 重定向简介
29 2