文件描述符及重定向
echo "This is a sample text 1" > temp.txt
# 文本重定向,截断文件的方式
# 意思是在把echo命令的输出写入文件前,temp.txt文件会被清空
cat temp.txt
echo "----"
echo "This is a sample text 2" >> temp.txt
# 追加文件方式
cat temp.txt
This is a sample text 1
----
This is a sample text 1
This is a sample text 2
错误信息输出
成功和不成功的命令
当一个命令发生错误并退回时,它会返回一个非0的退出状态
退出状态怎么看?
echo $?就可以打印出退出状态
# 会将stderr文本打印到屏幕上,而不是文件,因为没有
ls + > out.txt
# stderr转换成stdout,使得stderr和stdout都被重定向到同一个文件中
ls + >output.txt 2>&1
# tee追加方式写入
cat out.txt | tee -a out.txt | cat -n
bash
函数和参数
以两种方式实现fabonacii数列为例
#!/bin/bash
#递归方式实现斐波那契数列
function fib()
{
var=$1
if [[ $var = 1 || $var = 2 ]]; then
var=1
elif [[ $var -lt 1 ]]; then
return
else
var=`echo "$(fib $(( $var-2 ))) + $(fib $(( $var-1 )))" | bc `
fi
echo $var
return $?
}
#递推方式实现斐波那契数列
function fib2()
{
array_list=(0 1 1)
var=$1
if [[ $var -lt 1 ]]; then
return
fi
for((i=3;i<=$var;i++));do
array_list[$i]=`echo "${array_list[$(($i-1))]} + ${array_list[$(($i-2))]}" | bc `
done
echo ${array_list[$var]}
return $?
}
n=$1
result=$(fib $n)
echo $result
result=$(fib2 $n)
echo $result
迭代器
#!/bin/bash
# 三种循环方式
function loop()
{
for((i=0;i<10;i++)){
echo $i
}
count=0
while [[ $count -ne 10 ]]; do
# count=`echo "$count + 1" | bc`
let count++
echo $count
done
count=0
until [ $count -eq 10 ]; do
let count++
echo $count
done
}
loop
算术比较
-eq 相等
-ne 不相等
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
文件系统相关测试
p39
-f 是否是文件
-x 是否是可执行
-d 是否是目录
-e 是否存在
-c 是否是字符设备文件
-b 是否是块设备文件
-w 是否是可写文件
-r 是否是可读文件
-L 是否是符号链接
e.g.
#!/bin/bash
function sys_test()
{
# 文件存在
fpath="/etc/passwd"
[ -e $fpath ] && echo "file exist"
# 文件不存在
fpath='/qwdwq/qwdwqd'
[ -e $fpath ] || echo "file not exist"
}
sys_test
字符串进行比较
#!/bin/bash
function str_cmp()
{
str1=$1
str2=$2
if [ -z $str1 ] || [ -z $str2 ];then
echo "empty"
return 1
fi
if [[ $str1 > $str2 ]];then
echo "$str1 is bigger then $str2"
elif [[ $str1 < $str2 ]];then
echo "$str2 is bigger then $str1"
elif [[ $str1 == $str2 ]]; then
echo "$str1 equels to $str2"
fi
return 0
}
str_cmp $1 $2