shell编程入门详解--从基础到调试

1. 变量

1.1 变量定义

  • a=1 : 直接赋值即可定义普通变量
  • declare n : 定义普通变量
  • declare -i n : 定义数值变量
  • readonly n : 定义只读变量
  • export n : 定义环境变量(环境变量为进程私有,可被子进程继承)
  • local n : 定义局部变量(同名则在作用域覆盖全局变量)
  • unset n : 取消定义变量

1.2 变量使用

使用变量内容: $name${name},花括号为了识别边界

例:

a=123
echo $a # 显示: 123

1.3 数组

# 定义数组,用括号来表示数组,数组元素用"空格"符号分割开,若元素含空格,加上引号即可
array_name=(value0 value1 value2 value3)

#读取数组
${array_name[下标]}

# 获取数组中的所有元素
${array_name[@]}

# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}

# 取得数组单个元素的长度
lengthn=${#array_name[n]}

1.4 $()

$() 意味着先执行括号内的命令,并将命令返回的结果作为字符串替换$()

1.5 ``

`` 里面的命令会先执行,然后执行出来的结果作为字符串给外部

例:

ls -l `locate crontab`

会首先执行locate,然后ls显示locate到的目录.

1.6 引号

  • 单引号内的字符只能是一般字符,不会有特殊字符,无法引用外部变量
  • 而双引号可以引用外部变量.

例:

name=123
myname="$name its me"    #123 its me
myname='$name its me'     #$name its me

1.7 键盘读取变量:

read n  #当键盘输入 123 后, n的值为123
read -p "请输入数字" n   #会提示

1.8 数字运算

let : 其内置于bash中,除常用运算外,还提供了幂运算**

例:

let "a = 1 + 1"

b=9
c=5
let "a=$b+$c" # 注意有变量存在要使用双引号
let "((a=1+1,d=2+2,k=3+3))" # 多个求值

1.9. source 与 .

利用source执行脚本或. script.sh 是在本进程(bash)执行,会影响到本进程(主要是环境变量)

2. shell默认变量

  • $? 上一段代码或上一个命令的返回值,正常则返回0
  • $0 代表脚本文件名
  • $1 $2 …代表第一第二个参数
  • $# 代表参数个数
  • $@ 代表"$1" “$2” “$3” "$4"之意,每个变量是独立的
  • $* 代表"$1c$2c$3c$4",其中c为分隔符,默认是空格

3. 字符串操作

# 提取子字符串
string="linux is great"
echo ${string:1:4} # 输出 inux
echo ${string:1} # 从1这个位置开始截取

# 获取字符串长度
string="abcd"
echo ${#string} # 输出4

# 字符串拼接:
n="aa""bb"  # n=aabb
n="$(var)kk" # 这是另一种做法

# 查找子字符串
string="life is good"
echo `expr index "$string" is`

# 字符串替换
${变量/查找值/替换值} # 替换第一个,当查找中出现了:”/”请加转义符”\/”表示。(注意第一个一定要是一个变量的名字,然后查找和替换部分如果应用变量记得加上$)
${string//substring/replacement} # 全部替换

# 字符串删除
${string#substring}	# 从变量$string的开头, 删除最短匹配$substring的子串
${string##substring} # 从变量$string的开头, 删除最长匹配$substring的子串
${string%substring}	# 从变量$string的结尾, 删除最短匹配$substring的子串
${string%%substring} # 从变量$string的结尾, 删除最长匹配$substring的子串

4. if语句

  • 基本:
if [ command ]; then
statement
fi
  • 多选择:
if [ command ];then
  statement;
elif [ command ];then
  statement;
else
  statement;
fi

5. [] 条件判断

  • 基本格式 [ EXPRESSION ]
  • 格式: 中括号的左右扩弧和EXPRESSION之间都必须有空格!

不能在[ ]里面使用&&以及||,会报错

expression如下

(EXPRESSION) # EXPRESSION为真
! EXPRESSION # EXPRESSION为假
EXPRESSION -a EXPRESSION # 且 同时为真返回真
EXPRESSION -o EXPRESSION # 或 有一个为真返回真

STRING = STRING # 字符串相等 空格不得省略
STRING != STRING # 字符串不相等
-z STRING # STRING为空
-n STRING # STRING不为空

INTEGER1 eq INTEGER2 # 两数相等
INTEGER1 ne INTEGER2 # 不等于
INTEGER1 gt INTEGER2 # 大于
INTEGER1 ge INTEGER2 # 大于等于
INTEGER1 lt INTEGER2 # 小于
INTEGER1 le INTEGER2 # 小于等于

-b FILE :FILE是块设备
-c FILE :FILE是字符设备
-d FILE :FILE是文件夹
-e FILE :FILE存在
-f FILE :FILE是文件
-h FILE :FILE是硬链接
-L FILE :FILE是软链接
-r FILE :FILE存在且具有可读权限
-S FILE :FILE是Socket文件
-w FILE :FILE存在且具有可写权限
-x FILE :FILE存在且具有可执行权限

6. case语句

取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。;;相当于其他语言中的 break。如果没有匹配模式,使用星号 * 捕获该值。

casein
模式1)
    command1
    command2
    command3
    ;;
模式2)
    command1
    command2
    command3
    ;;
*)
    command1
    command2
    command3
    ;;
esac

7. 循环

7.1 for循环

# for循环实现打印1-10
for ((i=1;i<10;i++))
do
echo $i;
done

# for循环实现打印列表
for i in `cat mouse`
do
echo $i;
done
# 或
arr=(aaa bbb ccc ddd)
for i in ${arr[@]}
do
echo $i;
done
# 或
for i in a b c;
do
echo $i;
done;

7.2 while 循环

i=1
while [ $i -lt 10 ] # 如果 i 小于 10,就打印出来
do
    echo $i
    i=$[ $i + 1 ] # i加1
done

7.3. break 与 continue

用法与其它语言类似,例:

for i in a b c; do echo $i; if [ $i == b ]; then break; fi; done;
# 结果: a b

8. Shift的用法

  • 位置参数可以用shift命令左移。比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1、$2、$3丢弃,$0不移动。不带参数的shift命令相当于shift 1。

  • Shift 命令还有另外一个重要用途, Bsh 定义了9个位置变量,从 $1 到 $9,这并不意味着用户在命令行只能使用9个参数,借助 shift 命令可以访问多于9个的参数。

9. 函数

  • 定义:
function fun_name()
{
    return 0-255; # 只能返回0-255之间的数字
}

fun_name()
{
    echo $1 $2 $3 # 打印参数,第n个参数就是$n
}
  • 调用
fun_name 1 2 3  # 参数跟在函数名后面

10. 调试

  • 检查是否有语法错误:
bash -n script.sh
  • 调试脚本:
bash -x test.sh
  • 在脚本中动态启用调试
set +x # 开启
statements;
set -x # 关闭
  • 行号变量 $LINENO,该变量表示当前行号

附录:

延伸

  • bash其实还可以用wait来实现多线程编程,参考【https://blog.csdn.net/qq_21845263/article/details/94592103】
  • bash可以通过trap指令实现对信号的处理
  • grep,awk,sed三大工具非常值得一学

推荐资料

Shell脚本调试技术 - IBM developerWorks

  • 23
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值