zhenggaoxiong

《Linux shell 脚本攻略》第1章——读书笔记

文件描述符及重定向

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
posted @ 2020-04-19 18:48  zhenggaoxiong  阅读(72)  评论(0编辑  收藏  举报