再读:Linux系统命令及Shell脚本实践指南(三)
第十四章 测试和判断
$?
可以看命令的返回值。
test
和命令测试,
#方法一
kang@Mac :: ~/Downloads/PWN » test -e /var
kang@Mac :: ~/Downloads/PWN » echo $?
0
#方法二:
kang@Mac :: ~/Downloads/PWN 2 » [ -e /var ]
kang@Mac :: ~/Downloads/PWN » echo $?
0
if/else
判断
# 实例一
FILE="/var"
if [ -e $FILE ];then
echo "$FILE exist"
else
echo "$FILE not exist"
fi
#实例二
#!/bin/bash
echo -n "Hello world\n"
read SCORE
if [ "$SCORE" -lt 60 ];then
echo "pass"
else
echo "no pass"
fi
case
判断
#!/bin/bash
OS=$(uname -s)
case "$OS" in
Linux) echo "This is Linux" ;;
Darwin) echo "This is Mac Os" ;;
*) echo "Others system" ;;
esac
seq命令
类似python中range,可以输出不同类型的序列
- Sequence from 1 to 10:
seq 10
- Every 3rd number from 5 to 20:
seq 5 3 20
- Separate the output with a space instead of a newline:
seq -s " " 5 3 20
- Format output width to a minimum of 4 digits padding with zeros as necessary:
seq -f "%04g" 5 3 20
第十五章 循环
for
循环
#方法一
#!/bin/bash
for VAR in $(seq 1 10)
do
echo "Loop $VAR times"
done
#方法二,类似C++
for ((i=0;i<=10;i++))#注意是两个括号
do
echo "Loop $i times"
done
let
命令,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量
#!/bin/bash
sum=0
for VAR in $(seq 1 10)
do
let "sum+=VAR"
done
echo "In total: $sum"
select
是一种菜单扩展循环方式,其语法和带列表的for循环非常类似,基本结构如下
#!/bin/bash
echo "Hello world\n"
select VAR in apple banana beer
do
break
done
echo "You chose $VAR"
#效果
kang@Mac :: ~/Downloads/PWN » . ./shell.sh
Hello world
1) apple 2) banana 3) beer
?# 1
You chose apple
第十六章 函数
函数定义
#!/bin/bash
sayHello(){
echo "HELLO"
}
echo "call sayHello"
sayHello
函数返回值
利用
#!/bin/bash
FILE=/etc/notexistFIle
readFILE(){
if [ -f $FILE ];then# 空格总是容易忽略
return 0
else
return 1
fi#fi也总是容易忘记
}
readFILE
if [ $? -eq 0 ];then# $?返回上一个命令的状态
echo "$FILE exist"
else
echo "$FILE not exist"
fi
有参数函数
使用
#!/bin/bash
readFILE(){
if [ -f $1 ];then
return 0
else
return 1
fi
}
readFILE
if [ $? -eq 0 ];then
echo "$1 exist"
else
echo "$1 not exist"
echo "$2 lllll"
fi
计算一个数的多次方
#!/bin/bash
calculate(){
VALUE=1
for ((i=1;i<=$2;i++))
do
let "VALUE=VALUE*$1"
done
}
calculate $1 $2#这里的参数要有声明,否则会报错
echo "In total: $VALUE"
第十七章 重定向
所谓“重定向”,就是将原本应该从标准输入设备(键盘)输入的数据,改由其他文件或设备输入;或将原本应该输出到标准输出设备(显示器)的内容,改而输出到其他文件或设备上。
I/O重定向可以将任何文件、命令、脚本、程序或脚本的输出重定向到另外一个文件、命令、程序或脚本。
文件标识符
重定向中很重要的一个概念
Linux使用0到9的整数指明了与特定进程相关的数据流,系统在启动一个进程的同时会为该进程打开三个文件:标准输入(stdin)、标准输出(stdout)、标准错误输出(stderr),分别用文件标识符0、1、2来标识。
如果要为进程打开其他的输入输出,则需要从整数3开始标识。
标准输出覆盖重定向其实是默认将文件标识符为1的内容重定向到指定文件中
kang@Mac :: source/go/project » ls -l > qwe.txt
#等同于 ls -l 1> qwe.txt
kang@Mac :: source/go/project » cat qwe.txt
total 24
drwxr-xr-x@ 3 a staff 96 10 27 10:59 handler
-rwxr-xr-x@ 1 a staff 10887 10 27 10:59 main.go
-rw-r--r-- 1 a staff 0 12 17 16:55 qwe.txt
drwxr-xr-x@ 4 a staff 128 10 27 10:59 static
drwxr-xr-x@ 5 a staff 160 10 27 10:59 templates
drwxr-xr-x@ 3 a staff 96 10 27 10:59 upload
**标识输出重定向:>&**
标识输出重定向的作用是将一个标识的输出重定向到另一个标识的输入。
使用场景,重定向错误信息
kang@Mac :: source/go/project 130 » find / -name *.txt > qwe.txt
find: /usr/sbin/authserver: Permission denied
find: /Library/Application Support/Apple/ParentalControls/Users: Permission denied
#错误信息没有写入到文件里面,仍然是显示在页面。
kang@Mac :: source/go/project 130 » cat qwe.txt
kang@Mac :: source/go/project »
使用标识输出重定向:>&
kang@Mac :: source/go/project » find / -name *.txt > qwe.txt 2>&1
^C
kang@Mac :: source/go/project 130 » cat qwe.txt
find: /usr/sbin/authserver: Permission denied
find: /Library/Application Support/Apple/ParentalControls/Users: Permission denied
标准输入重定向:<
标准输入重定向可以将原本应由从标准输入设备中读取的内容转由文件内容输入,也就是将文件内容写入标准输入中。
kang@Mac :: source/go/project 255 » sort
qwer
adsf
edc
#标准输入进行了排序 结束control+D
adsf
edc
qwer
#使用标准输入重定向:< 来重定向排序,交给sort处理
kang@Mac :: source/go/project » sort < qwe.txt
ads
asdp
dsnt
jiup