shell 脚本用法手册

关键字用法

basename

 ~/Desktop  cat a.sh
#!/bin/bash
echo $(basename "$0")
echo $0

# 这个看不出区别
 ~/Desktop  sh a.sh
a.sh
a.sh

# 如果脚本是非当前路径执行,能拿到脚本名
 ~/Desktop  sh ~/Desktop/a.sh
a.sh
/Users/yangkaiyue/Desktop/a.sh

local

# 在函数内部创建变量, 只作用在函数内部
# local -r 定义局部只读变量
# 函数体内优先使用 local 声明的变量

 ~/Desktop  cat a.sh
#!/bin/bash
# 定义一个函数, 内部创建变量
defA() {
    local aa=10
    bb=20
    echo aa: $aa
    echo bb: $bb
}
# 执行函数
defA
# 外部并不会有aa变量产生,但是有bb变量,说明如果不使用local会让函数内变量作用到外部
echo aa: $aa
echo bb: $bb

 ~/Desktop  sh a.sh
aa: 10
bb: 20
aa:
bb: 20

shift

# 将接收的位置参数左移(删除最左边的一个参数)
 ~/Desktop  cat a.sh
#!/bin/bash
echo $@
shift
echo $@

 ~/Desktop  sh a.sh 1 2 3 4
1 2 3 4
2 3 4

# shell中函数参数也是由位置参数接收,所以同样可以用于函数
 ~/Desktop  cat a.sh
#!/bin/bash
a() {
  echo $@
  # 这里去掉两个
  shift 2
  echo $@
}
a 1 2 3 4

 ~/Desktop  sh a.sh
1 2 3 4
3 4

readonly

# 该变量定义后不可更改

 ~/Desktop  cat a.sh
#!/bin/bash
readonly z=0
echo $z
z=3
echo $z

 ~/Desktop  sh a.sh
0
# 报错提示,无法修改只读变量z
a.sh: line 4: z: readonly variable

expr

# 用于计算,运算符前后需要空格

echo `expr 2 + 3`

$ 的使用

# 获得返回值
echo $?

# 获得脚本名,严格的说是 sh 后边的那个参数,如果 sh /a/b/c/s.sh,则 $0结果为 /a/b/c/s.sh
echo $0

# 获得位置参数
echo $1~$n

# 获得位置参数个数
echo $#

# 当前进程号,常用于脚本
echo $$

# $@ 和 $* 的区别
# 直接使用的情况下, $@ 和 $* 是一样的
# 引用状态下, "$@" 理解为 ["$1", "$2", "$3"], "$*" 理解为 "$1 $2 $3"
 ~/Desktop  cat a.sh
#!/bin/bash
for i in "$@";do
  echo $i
done

for i in "$*";do
  echo $i
done

 ~/Desktop  sh a.sh 1 2 3
1
2
3
1 2 3

${} - 变量相关

字符串截取

# 准备变量
file=/dir1/dir2/dir3/my.file.txt

# 截取 $file[0:0+5]
${file:0:5}

# 截取 $file[5:5+5]
${file:5:5}

字符串删除

# 准备变量
file=/dir1/dir2/dir3/my.file.txt

# 删掉第一个/ 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file#*/}

# 删掉最后一个/  及其左边的字符串:my.file.txt
${file##*/}

# 删掉最后一个 /  及其右边的字符串:/dir1/dir2/dir3
${file%/*}

# 删掉第一个/  及其右边的字符串:(空值)
${file%%/*}

字符串替换

# 准备变量
file=/dir1/dir2/dir3/my.file.txt

# 将第一个dir 替换为path:/path1/dir2/dir3/my.file.txt
${file/dir/path}

# 将全部dir 替换为path:/path1/path2/path3/my.file.txt
${file//dir/path}

设置默认值

 ~/Desktop  cat a.sh
#!/bin/bash

a="my_var"
my_var="Hello, World"
b="Fallback Value"

result1="${a:-$b}"     # 结果是 "Hello, World",因为变量 "a" 存在且不为空
result2="${c:-$b}"  # 结果是 "Fallback Value",因为 "c" 未定义
result3="${!a:-$b}"

echo $result1
echo $result2
echo $result

 ~/Desktop sh a.sh 
my_var										# $a 被定义,result1使用$a
Fallback Value						# $c 未被定义,result2使用$b
Hello, World							# {!a} 理解为 $a 的值作为变量名进行引用,即判断 $my_var 是否存在,存在则使用

其他

# 变量长度
${#var} 

# 未验证
${file-my.file.txt} :假如$file 沒有设定,則使用my.file.txt 作传回值。(空值及非空值時不作处理) 
${file:-my.file.txt} :假如$file 沒有設定或為空值,則使用my.file.txt 作傳回值。(非空值時不作处理)
${file+my.file.txt} :假如$file 設為空值或非空值,均使用my.file.txt 作傳回值。(沒設定時不作处理)
${file:+my.file.txt} :若$file 為非空值,則使用my.file.txt 作傳回值。(沒設定及空值時不作处理)
${file=my.file.txt} :若$file 沒設定,則使用my.file.txt 作傳回值,同時將$file 賦值為my.file.txt 。(空值及非空值時不作处理)
${file:=my.file.txt} :若$file 沒設定或為空值,則使用my.file.txt 作傳回值,同時將$file 賦值為my.file.txt 。(非空值時不作处理)
${file?my.file.txt} :若$file 沒設定,則將my.file.txt 輸出至STDERR。(空值及非空值時不作处理)

变量为空报错 - ${var:?msg}

# 如果 $var 不存在则将 msg 输出到 stderr 中,并停止后续执行
# msg 支持变量, ${var:$msg}

 ~/Desktop  cat a.sh
#!/bin/bash
echo ${file:?"var file not exist"}
echo "end"

 ~/Desktop  sh a.sh
 a.sh: line 3: file: var file not exist
 # 这里没有执行 echo "end"

数组的使用

定义

# shell 中数组: (x y z) 
# 元素由空格进行分隔
# 类型默认为 string, 不需要引号声明

# 1. 直接定义数组
arr=(1 2 3)

# 2. 利用索引定义
arr[3]=4

使用

# 长度
echo ${#arr[@]}
echo ${#arr[*]}

# 获取索引
echo ${!arr[@]}
echo ${!arr[*]}

# 获取所有值
echo ${arr[@]}
echo ${arr[*]}

# 根据索引取值
echo arr[0]
echo arr[1]

# 根据值遍历数组
for i in ${arr[@]};do
    echo $i
done

# 根据索引遍历数组
for i in ${!arr@]};do
    # 增加索引判断
    if [ $i = 2 ];then
        echo ${arr$i]}
    fi
done

容错

位置参数为空

# 方案1,使用 $# 判断位置参数长度,如果参数长度不合规则退出
if [[ $# -nq 4 ]];then
    exit 99
fi

# 方案2,预置默认值避免参数为空
age=${1:-18}

# 方案3,判断参数字符串长度
# -z zero, 字符串长度为0为真
# -n non-zero, 字符串长度非0为真
if [[ -z $1 ]];then
    exit 99
fi

常用

`` - 执行命令

# 用于执行命令

a=`date`
echo $a # 2023年10月11日 星期三 15时00分40秒 CST

$() - 执行命令

# 用于执行命令

b=$(date)
echo $b # 2023年10月11日 星期三 15时00分40秒 CST

$(()) - 计算

# 用于计算

echo $((2+3)) # 5

[] 和 [[]] - 对比判断


参考链接

  • https://www.cnblogs.com/pugang/p/13167714.html
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值