Loading

linux shell 编程

介绍

shell 是 linux 下的脚本,可以很方便的执行一些操作,而不用编写程序编译

解释器

注:可以省略

脚本不指定的话就会采用系统默认的解释器去执行,但可以在脚本中进行指定,格式

#!/bin/bash

其必须在基本文件的第一行,并且以#!开头,后面接解释器路径,如果指定没有解释器,则会报错

都有哪些解释器

  • sh:unix 默认,所有的 unix 系统都有
  • bash:linux 默认,所哟 linux 发行版都有

其他的想到再加

文件包含

相当于#include

. filename   # 注意点号(.)和文件名中间有一空格

或

source filename

变量

定义变量

str="abc" # 定义字符串
num=123 # 定义数字
cmd=$(cat test.file) # 通过命令

等号两侧没有空格

使用变量

shell 使用变量直接用美元符号即可

ch="aaa"
echo $ch
echo ${ch} #两种方式是等效的

cb="bbb"
re="$ch$cb" # "aaabbb"

特殊变量

$n:脚本传参的第 n 个参数
$#:脚本的参数个数
$?:上一个命令的运行结果
$@:所有参数
$*:所有参数
$$:当前进程 id
$?:上一个进程/函数的返回值

注: $*$@ 在不加引号时候使用是一样的,当使用引号后 "$*" 会将所有参数合成一个参数作为一个字符串, "$@" 则还是多个参数

函数

定义

[function] funname [()] {
		...body...
}

其中 "function"和"()" 至少有一个,可以都有

函数获取参数以及返回值和脚本一致,通过$n 获取第 n 个参数,并且可以通过 $? 获取函数返回参数

function test(){
		echo $1 // aaa
		exit 1
}

test aaa
echo $? // 1

条件流程

if

if [ command ];then
     # 符合该条件执行的语句
elif [ command ];then
     # 符合该条件执行的语句
elif [[ command ]] ;then
     # 符合该条件执行的语句
else
     # 符合该条件执行的语句
fi

case

case "$op" in
"upload")
		echo $op
;;
*)
    panic "operation $op not allowed"
    help
;;
esac

循环流程

for

lines=$(cat test.file)
for li in lines;do
	echo $li
done

# 以下都是可以的
for((i=1;i<=10;i++));
for i in $(seq 1 10);
for i in {1..10};
for i in f1 f2 f3 ;
for file in /Volumes/work/*;

while

while [ $i -le 100 ];do
	i=$(( $i + 1))
done

一些判断条件

文件相关

常用的:
[ -a FILE ] 如果 FILE 存在则为真。
[ -d FILE ] 如果 FILE 存在且是一个目录则返回为真。
[ -e FILE ] 如果 指定的文件或目录存在时返回为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则返回为真。
[ -r FILE ] 如果 FILE 存在且是可读的则返回为真。
[ -w FILE ] 如果 FILE 存在且是可写的则返回为真。(一个目录为了它的内容被访问必然是可执行的)
[ -x FILE ] 如果 FILE 存在且是可执行的则返回为真。

不常用的:
[ -b FILE ] 如果 FILE 存在且是一个块文件则返回为真。
[ -c FILE ] 如果 FILE 存在且是一个字符文件则返回为真。
[ -g FILE ] 如果 FILE 存在且设置了SGID则返回为真。
[ -h FILE ] 如果 FILE 存在且是一个符号符号链接文件则返回为真。(该选项在一些老系统上无效)
[ -k FILE ] 如果 FILE 存在且已经设置了冒险位则返回为真。
[ -p FILE ] 如果 FILE 存并且是命令管道时返回为真。
[ -s FILE ] 如果 FILE 存在且大小非0时为真则返回为真。
[ -u FILE ] 如果 FILE 存在且设置了SUID位时返回为真。
[ -O FILE ] 如果 FILE 存在且属有效用户ID则返回为真。
[ -G FILE ] 如果 FILE 存在且默认组为当前组则返回为真。(只检查系统默认组)
[ -L FILE ] 如果 FILE 存在且是一个符号连接则返回为真。
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则返回为真。
[ -S FILE ] 如果 FILE 存在且是一个套接字则返回为真。
[ FILE1 -nt FILE2 ] 如果 FILE1 比 FILE2 新, 或者 FILE1 存在但是 FILE2 不存在则返回为真。
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 老, 或者 FILE2 存在但是 FILE1 不存在则返回为真。
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则返回为真。

字符串相关

[ -z STRING ] 如果STRING的长度为零则返回为真,即空是真
[ -n STRING ] 如果STRING的长度非零则返回为真,即非空是真
[ STRING1 ]  如果字符串不为空则返回为真,与-n类似
[ STRING1 == STRING2 ] 如果两个字符串相同则返回为真
[ STRING1 != STRING2 ] 如果字符串不相同则返回为真
[ STRING1 < STRING2 ] 如果 “STRING1”字典排序在“STRING2”前面则返回为真。
[ STRING1 > STRING2 ] 如果 “STRING1”字典排序在“STRING2”后面则返回为真。

数字

[ INT1 -eq INT2 ] INT1和INT2两数相等返回为真 ,=
[ INT1 -ne INT2 ] INT1和INT2两数不等返回为真 ,<>
[ INT1 -gt INT2 ] INT1大于INT2返回为真 ,>
[ INT1 -ge INT2 ] INT1大于等于INT2返回为真,>=
[ INT1 -lt INT2 ] INT1小于INT2返回为真 ,<
[ INT1 -le INT2 ] INT1小于等于INT2返回为真,<=

逻辑

[ ! EXPR ] 逻辑非,如果 EXPR 是false则返回为真。
[ EXPR1 -a EXPR2 ] 逻辑与,如果 EXPR1 and EXPR2 全真则返回为真。
[ EXPR1 -o EXPR2 ] 逻辑或,如果 EXPR1 或者 EXPR2 为真则返回为真。
[ ] || [ ] 用OR来合并两个条件
[ ] && [ ] 用AND来合并两个条件

括号

${}:直接取值
[]:用在 while,if 判断
[[]]:高级运算,可以替换[]
$():执行命令
$(()):执行算术运算

一些脚本

判断当前系统

#!/bin/sh

SYSTEM=`uname  -s`
if [ $SYSTEM = "Linux" ] ; then
   echo "Linux"
elif
    [ $SYSTEM = "FreeBSD" ] ; then
   echo "FreeBSD"
elif
    [ $SYSTEM = "Solaris" ] ; then
    echo "Solaris"
else
    echo  "What?"
fi

参考

Bash Shell $*, $@, $#, $$, $!, $?, $- 和 $_
shell中的if语句

posted @ 2023-12-16 17:18  _小孟同学  阅读(11)  评论(0编辑  收藏  举报