shell学习笔记

本文详细介绍了Shell脚本中的重要概念,包括set -e和set +e的用法,test命令的数值、字符串和文件测试,以及shell变量、字符串处理、数组、注释、参数传递、基本运算符和流程控制结构。还涵盖了echo、read、printf命令的使用,以及函数和输入输出重定向等内容。
摘要由CSDN通过智能技术生成

shell学习笔记

set -e, set +e 用法

# script A
set -e # Exit the script if an error happens
# script B
set +e # Don't bail out of bash script if ccache doesn't exist
# script C
set -e # Back to regula "bail out on error" mode
  • A和C中的脚本执行的时侯,如果出现了返回值为非零,整个脚本就会立即退出
  • B脚本中如果出现了返回值为非零,将会继续执行下面的脚本C
  • set -e之后出现的代码,一旦出现了返回值非零的情况,整个脚本就会立即退出。
  • set -e作用范围只限于脚本执行的当前进行,不作用于其创建的子进程。

test 命令

  • 用于检查文件或比较值,可以进行数值、字符和文件三个方面的测试
if test $[num1] -eq $[num2]  # 比较两个数值是否相等
then
	echo '两个数相等!'
else
	echo '两个数不相等!'
fi
  • 数值测试:
参数说明
-eq等于则为真
-ne不等于则为真
-gt大于则为真
-lt小球则为真
-ge大于等于则为真
-le小于等于则为真
  • 字符串测试
参数说明
=等于则为真
!=不等于则为真
-z 字符串字符串长度为零则为真
-n 字符串字符串长度不为零则为真
  • 文件测试
参数说明
-e 文件名如果文件存在则为真
-r 文件名如果文件存在且可读则为真
-w 文件名如果文件存在且可写则为真
-x 文件名如果文件存在且可执行则为真
-s 文件名如果文件存在且至少有一个字符则为真
-d 文件名如果文件存在且为目录则为真
-f 文件名如果文件存在且为普通文件则为真
-c 文件名如果文件存在且为字符型特殊文件则为真
-b 文件名如果文件存在且为块特殊文件则为真
  • 此外,Shell还提供了“与”(-a)、“或”(-o)、“非”(!)三个逻辑操作符用于将测试条件连接起来。其优先级为:非>与>或。
  • 注意:中括号[ ]可用于一些条件的测试,中括号与其中间的代码应该有空格隔开,如
if [ -n "$1" ]; then
	echo "包含第一个参数"
else
	echo "没有包含第一个参数"
fi

shell 变量

your_name="runoob.com"
  • 变量名和等号之间不能有空格。
  • 用语句给变量赋值
# 将/etc目录下的文件名循环出来
for file in 'ls /etc'
# or
for file in $(ls /etc)
  • 使用变量
for skill in Ada Coffe Action Java; do
	echo "I am good at ${skill}Script"
done

your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name
  • 设置为只读变量
myUrl="https://www.google.com"
readonly myUrl  ## 设置为只读变量
  • 删除变量
unset variable_name
  • 变量类型

    1. 局部变量 脚本或命令中定义,仅在当前shell中有效
    2. 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量
    3. shell变量 由shell程序设置的特殊变量。shell变量中部分为环境变量,部分为局部变量,这些变量保证了shell的正常运行

shell字符串

  • 字符串可以用单引号,也可以用双引号,也可以不用引号,单双引号的区别跟PHP类似
your_name='runoob'
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str
# 输出结果为
# Hello, I know you are "runoob"!
  • 双引号的优点:

    1. 可以有变量
    2. 可以出现转义字符
  • 拼接字符串

your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1 # 输出 hello, runoob ! hello, runoob !
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3 # 输出 hello, runoob! hello ${your_name} !
  • 获取字符串长度
string="abcd"
echo ${#string} # 输出 4
  • 提取子字符串
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo
  • 查找子字符串
string="runnob is a great site"
echo `expr index "$string" io` # 输出 4

shell数组

# 数组名=(值1 值2 ... 值n)
array_name=(value0 value1 value2 value3)
# 读取数组
echo ${array_name[@]}  # 显示数组中的所有元素
echo ${array_name[*]}  # 与上面作用相同
valuen=${array_name[n]}  # 读取第n个值
# 获取数组长度的方法与攻取字符串长度的方法相同,如
echo "数组元素的个数为:${#array_name[*]}"
echo "数组元素的个数为:${#array_name[@]}"

shell注释

  • 多行注释
:<<EOF
注释内容...
注释内容...
注释内容...
EOF

# 也可以使用其它符号
:<<'
注释内容...
注释内容...
注释内容...
'

:<<!
注释内容...
注释内容...
注释内容...
!

shell传递参数

  • $0表示本身,$1-$n表示1到n个参数
  • $#表示传递到脚本的参数个数
  • 其它
参数处理说明
$*以单个字符串形式显示所有向脚本传递的参数
$$脚本运行的当前进程的ID号
$!后台进行的最后一个进行的ID号
$@与$*类似,如"$@", 则输出"$1""$2""$3"
$-显示shell使用的当前选项,与set命令功能相同
$?显示最后命令的退出状态。0表示没有错误,其他任何情况表示有错误

shell基本运算符

数学运算:

  • 原生bash不支持简单的数学运算,但可以通过其它命令来实现,如awk和expr, expr最常用
  • expr是一款表达式计算工具,使用它能完成表达式的求值操作,如:
#! /bin/bash

val = `expr 2 + 2`
echo "两个数之和为: $val"

a=10
b=20

val=`expr $a \* $b`  # a*b
val=`expr $b/$a`  # b/a
val=`expr $b % $a`  # 取余
  • 在MAC中shell的expr语法是:$((表达式)),此处表达式中的"*“不需要转义符号”\"。

布尔运算:

  • !, -o, -a分别表示非、或、与运算

逻辑运算:

  • &&, ||分别表示逻辑AND和OR

字符串运算:

  • 包括检查两个字符串是否相等,单个字符串长度是否为0,字符串是否为空$

文件测试运算:

echo命令

#! /bin/bash
echo -e "ok! \n"  # -e 开启转义, \n换行
echo -e "ok! \c"  # -e 开启转义, \c不换行
echo '$name\"'  # 使用单引号,不进行转义或取变量,原样输出字符串
echo `date`  # 显示date命令执行结果

read命令

  • read命令一个一个词组地接收输入的参数,每个词组需要使用空格进行分隔;如果输入的词组个数大于需要的参数个数,则多出的词组将被作为整体为最后一个参数接收
#! /bin/bash
read firstStr secondStr
echo "第一个参数:$firstStr; 第二个参数:$secondStr"

read -p "请输入一段文字:" -n 6 -t 5 -s password
# 说明: -p 表示输入提示文字;-n表示输入字符长度限制(达到6位自动结束);-t表示输入限时;-s表示隐藏输入内容
echo -e "\npassword is $password"

printf命令

  • 使用printf的脚本比echo移植性更好
  • printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等
  • 默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n
#!/bin/bash

# 语法 printf format-string [arguments...]
# format-string为格式控制字符串;arguments为参数列表
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 

shell流程控制

  • 和Java, PHP等语言不一样,sh的流程控制不可为空

if语句

if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi  # 写成一行时用;
# 或者
if [ $(ps -ef | grep -c "ssh") -gt 1 ]
then
	echo "true"
fi

a=10
b=20
if [ $a == $b ]
then
   echo "a 等于 b"
elif [ $a -gt $b ]
then
   echo "a 大于 b"
elif [ $a -lt $b ]
then
   echo "a 小于 b"
else
   echo "没有符合的条件"
fi

for循环

for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

while语句

while condition  # true 则继续执行
do
	command
done

int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"  # bash let 命令用于执行一个或多个表达式,变量计算中不需要加上$来表示变量
done

echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的网站名: '
while read FILM
do
    echo "是的!$FILM 是一个好网站"
done

until循环

until condition  # false 则继续执行
do
	command
done

case语句

  • 匹配成功则执行相匹配的命令
case val in
mode1)
    command1
    command2
    commandN
    ;;
mode2)
    command1
    command2
    commandN
    ;;
esac

echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
    1)  echo '你选择了 1'
    ;;
    2)  echo '你选择了 2'
    ;;
    3)  echo '你选择了 3'
    ;;
    4)  echo '你选择了 4'
    ;;
    *)  echo '你没有输入 1 到 4 之间的数字'
    ;;
esac

break, continue用法与C同

函数

#! /bin/bash

demoFun(){
    echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"

function funWithReturn(){  # 关键字function可加可不加
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum$anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"  # $?用于显示命令的退出状态,0表示无错误

funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"  # 注意这里要用{}, 否则返回的不是第10个参数值
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

输入输出重定向

who > users_list
echo "hello" > users_list  # 覆盖原文件
echo "文件后追加内容" >> users_list  # 追加内容

wc -l < users_list  # 输入重定向
command < infile > outfile  # 同时替换输入和输出,执行command1, 从文件infile读取内容,然后输出写入到outfile中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值