驽马十驾 驽马十驾

驽马十驾,功在不舍

目录
shell脚本新手可能会犯的错误
/  

shell脚本新手可能会犯的错误

函数使用

Shell 的函数就是一个大坑,坑的人不要不要的,之前写了专门的文章来解读,这里放上总结。

  • 函数的参数不需要显示声明,需要传递参数的时候,写在函数名的后面,多个参数值通过空格分开
  • 使用函数的参数的时候,通过$0-$n来调用。
  • 函数的返回值只能是数值类型,不能是字符串类型。
  • 将函数调用后赋值给a的操作a=$(sum),其表示的函数的意义是标准输出,如果要获取返回值需要通过$?

$?表示的含义其实是上一次命令的返回值,所以假如要获取返回值,一定要在函数执行的下一行使用该变量

分号的使用

shell 脚本中,分号通常用在一行的 shell 脚本但是有多个模块存在的情形。比如下面这个脚本

# 一行的写法
if [ "$PS1" ]; then echo "are you ok"; fi
# 多行写法
if [ "$PS1" ] 
	then echo "are you ok"
fi

空格的使用

这个空格是把我坑惨了的地方,因为我写Java\C#\Kotlin都会将空格来美化,但是 Shell 脚本对此定义不同。有些地方必须加,有些地方不能加。

赋值的语句不能加空格

# 合法
i=1
i=$((i++))
# 不合法
i = 1
i = $((i++))

if 条件语句判定必须加

# 合法
if [ i -eq 1 ]
	echo "ok"
fi

#不合法1,i前面没有空格
if [i -eq 1 ]
	echo "ok"
fi

#不合法2,1 后面没有空格
if [ i -eq 1]
	echo "ok"
fi

遵循一个原则:除了特定要加的地方二外,其他都不要加空格。

符号的区别

  • ${}通常是取值操作
  • $(command)command ,都是执行其中的命令,然后将标准输出赋值给变量(如果有)
  • (()) 双括号通常有 2 个含义
    • 自增:((i++)) 表示对 i进行自增
    • for的条件:((i = 1; i <= 10; i++))
  • [ command ] 通常用在循环语句中做判定条件。
  • [[ command ]] 同样可以用于作为判定,不过此判定更加健壮可以再其中写条件
i=6
# 这种写法合法
if [[ $i -ge 5 && $i -le 10 ]]; then
  echo "success"
fi

# 这种写法不合法
if [ $i -ge 5 && $i -le 10 ]; then
  echo "success"
fi

# 如果用单括号,需要改为
i=6
if [ $i -ge 5 ] && [ $i -le 10 ]; then
  echo "success"
fi
骐骥一跃,不能十步。驽马十驾,功在不舍。