简单Shell教程

173 阅读3分钟

Shell,简单归纳shell的语法有以下几点

  1. 变量定义及使用、数组定义及使用
  2. 参数的传递及使用
  3. 运算符,包括算术运算、逻辑运算、或与运算等等
  4. 条件判断及循环
  5. 函数定义及使用
  6. 输入输出
  7. 其它 具体请参考下面的shell文件
#!/bin/bash
# 定义一个变量,使用变量直接通过$或者${}引用即可
myapp='variable'
# readonly可以将变量设置为只读,则变量不可变更,也不能删除
readonly myapp
echo "welcome shell world, $myapp"
# unset用来删除变量
unset myapp
# 字符串可以通过''或者""或者不用引号,单引号表示字符串原样输出,双引号表示字符串会进行转换,即引用的变量会转成真正的含义,转义符号也会进行转义
str="abcd"
# 获取字符串长度可以用${#variable}获取
echo ${#str}
# 截取字符串可以通过${variable:startIndex:endIndex}获取
echo ${str:1:3}
# 定义数组使用(),元素用空格分隔
array=(2 4 6 1)
echo "获取数组第三个元素 ${array[3]}"
echo "获取数组所有元素${array[@]}"
# 获取传递的参数通过$n进行获取,$0表示文件名,$1表示第一个参数...
# 特殊字符处理参数
# $# 传递到脚本的参数个数
# $* 以一个单字符串显示所有向脚本传递的参数
# $$ 脚本运行的当前进程ID
# $! 后台运行的最后一个进程的ID
# $@ 类似$*
# $- 显示shell使用的当前选项,类似set命令
# $? 显示最后命令的退出状态 0表示无错误,其它都是错

# 运算符
# 算术运算符,包括+ - * / % = != ==,通过`expr`进行计算,表达式和运算符之间必须有空格,*需要转义,即使用\*表示
a=10
b=20
var=`expr $a + $b`
echo a+b:$var
var1=`expr $a \* $b`
echo a*b:$var1
# 关系运算符,只支持数字,包括-eq(等于) -ne(不等于) -gt(大于) -lt(小于) -ge(大于等于) -le(小于等于)
# 布尔运算符,包括!(非运算) -o(或运算) -a(与运算)
# 逻辑运算符,包括&&(逻辑and) ||(逻辑or)
# 字符串运算符,包括=(相等) !=(不相等) -z(字符串长度是否为0) -n(字符串长度是否非0) str(是否为空)
# 文件测试运算符,包括-b(是否块设备文件) -c(是否字符设备文件) -d(是否目录) -f(是否普通文件) -g(是否设置了SGID位) -k(是否设置粘着位) -p(是否有名管道) -u(是否设置SUID)
#                  -r(是否可读) -w(是否可写) -x(是否可执行) -s(是否为空或大小是否大于0) -e(是否存在)


# Shell流程控制
# if..else
if [ $a -gt $b ]
then
echo "a大于b"
elif [ $a -lt $b ]
then
echo "a小于b"
else
echo "a等于b"
fi
# 条件表达式必须在[]之间,且必须有空格

# for...循环
for item in ${array[@]}
do
echo "for循环数组,元素为${item}"
done

# while...循环
int=1
while(($int<=5))
do
  echo "while循环$int"
  let int++
done

# until...循环,类似do...while循环
ut=100
until [ $ut -eq 0 ]
do
  echo "until循环$ut"
  ut=$[ $ut - 25 ]
done

# case
echo "请输入选择:"
read num
case $num in
1) echo "你选择了1"
;;
2) echo "你选择了2"
;;
3) echo "你选择了3"
;;
*) echo "你选错了"
;;
esac

# Shell函数,通过$?获取函数返回值
funReturn(){
  echo "对输入的数字进行相加的函数:"
  echo "请输入第一个数字:"
  read first
  echo "请输入第二个数字:"
  read second
  return $(($first+$second))
}
funReturn
echo "funReturn()函数的返回值为:$?"

# Shell输入输出重定向
# 文件描述符:0-表示标准输入 1-表示标准输出 2-表示错误输出
# 如果希望执行的命令不在屏幕输出,则可以重定向到/dev/null,例如 command > /dev/null
# command > file 输出重定向到file
# command < file 输入重定向到file
# command >> file 输出追加到file
# n > file 文件描述符为n的文件重定向到file
# n >> file 文件描述符为n的文件追加到file
# n >& m 输出文件m和n合并
# n <& m 输入文件m和n合并
# << tag 开始标记tag和结束标记tag之间的内容作为输入

# nohup .. &:nohup表示不挂断的运行命令,&表示在后台运行