Shell-输出/判断/管道

学习就要趁热打铁.

输入输出

Linux下有标准的输出输出,为stdin,stdout,stderr.其中stdin是从键盘获取输入,文件描述符为0;stdout则是将内容输出到屏幕,文件描述符为1;而stderr则类似stdout,也是输出到屏幕,但文件描述符为2.

三者都可以重定向.

shell中可以使用echo,printf将内容输出.

echo语法:

echo "content."

printf语法:

printf format-string [arguments…]

其中format-string可以使用%s %c %d %f等格式替代符,并支持指定宽度与小数位数.
即:

#!/bin/bash

printf "%-10s %-8s %-6s\n" Name Sex Weight
printf "%-10s %-8s %-6.2f\n" Allen male 60.2222 
printf "%-10s %-8s %-6.2f\n" Jon male 54.503 
printf "%-10s %-8s %-6.2f\n" Angel female 48.0539 

让我们来重定向吧.

#!/bin/bash
# 将输出重定向到out文件.这时,out文件如果不存在则会创建赋值,如果out文件存在,则其中内容都将被覆盖.
echo "this is content." > out

# 将输出重定向到out文件.不同的是,如果out文件存在则内容将会追加到文件尾行,若不存在,则创建并赋值.
echo "this is new content." >> out

管道

管道通过符号 | 实现.其是将本条的输出内容作为参数传给其后的命令.

举个栗子.

假设有文件out,其内容如下:

file1,file2
txt,png
2012-06
june,july
summer,autumn

若哥想只看包含2012这个词行,则可以使用如下命令:

cat ./out | grep '2012'

if 判断

  1. if是条件判断语句.其基本语法如下:
if [ condition ];then
  command
elif [[ condition ]];then
  command
else
  command
fi

其中[]是一条命令,而[[ ]]则是关键字,后者要比前者强大,当然了,大部分情况下都能互用.
2. 文件/文件夹(目录)判断
[ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真
[ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真
[ -d DIR ] 如果 FILE 存在且是一个目录则为真
[ -e FILE ] 如果 FILE 存在则为真
[ -f FILE ] 如果 FILE 存在且是一个普通文件则为真
[ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真
[ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真
[ -p FILE ] 如果 FILE 存在且是一个名字管道(F如果O)则为真
[ -r FILE ] 如果 FILE 存在且是可读的则为真
[ -s FILE ] 如果 FILE 存在且大小不为0则为真
[ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真
[ -u FILE ] 如果 FILE 存在且设置了SUID (set user ID)则为真
[ -w FILE ] 如果 FILE存在且是可写的则为真
[ -x FILE ] 如果 FILE 存在且是可执行的则为真
[ -O FILE ] 如果 FILE 存在且属有效用户ID则为真
[ -G FILE ] 如果 FILE 存在且属有效用户组则为真
[ -L FILE ] 如果 FILE 存在且是一个符号连接则为真
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则为真
[ -S FILE ] 如果 FILE 存在且是一个套接字则为真
[ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真

  1. 字符串判断
    [ -z STRING ] 如果STRING的长度为零则为真 ,即判断是否为空,空即是真
    [ -n STRING ] 如果STRING的长度非零则为真 ,即判断是否为非空,非空即是真
    [ STRING1 = STRING2 ] 如果两个字符串相同则为真
    [ STRING1 == STRING2 ] 如果两个字符串相同则为真
    [ STRING1 != STRING2 ] 如果字符串不相同则为真
    [ STRING1 ]  如果字符串不为空则为真,与-n类似

  2. 数值判断
    [ INT1 -eq INT2 ]     INT1和INT2两数相等为真 ,=
    [ INT1 -ne INT2 ]     INT1和INT2两数不等为真 ,<>
    [ INT1 -gt INT2 ]     INT1大于INT1为真 ,>
    [ INT1 -ge INT2 ]     INT1大于等于INT2为真,>=
    [ INT1 -lt INT2 ]     INT1小于INT2为真 ,<
    [ INT1 -le INT2 ]     INT1小于等于INT2为真,<=

  3. 复杂逻辑判断
    -a 与
    -o 或
    ! 非


参考:
shell中if条件字符串、数字比对,[[ ]]和[ ]区别