💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] ## 变量 ### 创建变量 ``` a=z # 变量 a 赋值为字符串 z b="a string" # 包含空格,就必须放在引号里面 c="a string and $b" # 变量值可以引用其他变量的值 d="\t\ta string\n" # 变量值可以使用转义字符 e=$(ls -l foo.txt) # 变量值可以是命令的执行结果 e=`ls -l foo.tx` # 变量值可以是命令的执行结果(使用反引号) f=$((5 * 7)) # 变量值可以是数学运算的结果 ``` ### 读取变量 如果变量不存在,Bash **不会报错**,而会输出空字符 2. 如果变量的值本身也是变量,可以使用`${!parameter}`的语法 ``` ${!parameter} ``` 3. 设置默认值 ``` ${a:=b} ``` 4. 切断 ``` ${parameter:offset} 从第offset之后开始 a="123456" ,echo ${a:2},3456 ${parameter:offset:length} length 设置长度为6 ``` 5. 变量长度 ``` ${#parameter} ``` 6. 打印数组 ``` ${!name[@]} |${!name[*]} 打印索引 ${name[@]} | ${!name[*]} 打印元素 ``` 7.过滤前缀 ``` ${parameter#word} ${parameter##word} ``` 不打印匹配的world #### ${param:?}读取变量为空报错 ``` rm -rf ${a:?错误提示语句(a不存在)}/ ``` 默认 `${a}`为空不报错,某些场景下非常不安全,使用 `${a:?}`如果变量不存在就会报错. ### 删除变量 ``` // 方式一:unset 也是把值变为 空字符 unset NAME //方式二(推荐): $ foo='' $ foo= ``` ### export 导出变量 子 Shell 默认读取不到父 Shell 定义的变量,可使用 export ``` NAME=foo export NAME //or export NAME=foo ``` ## 特殊变量 ### $? 上个命令的退出状态 `$?`为上一个命令的退出码,用来判断上一个命令是否执行成功。返回值是`0`,表示上一个命令执行成功;如果是非零,上一个命令执行失败 ### $$ 当前Shell进程ID `$$`为当前 Shell 的进程 ID ``` $ echo $$ 10662 ``` 这个特殊变量可以用来命名临时文件。 ``` LOGFILE=/tmp/output_log.$$ ``` ### $n n为1,2,3... 传递给脚本或函数的参数 ### $# 参数个数 ### $_ 上一个命令的最后一个参数 ``` $ grep dictionary /usr/share/dict/words dictionary $ echo $_ /usr/share/dict/words ``` ### $! 最近一个后台执行的异步命令的进程 ID ``` $ firefox & [1] 11064 $ echo $! 11064 ``` ### $0 当前脚本的文件名 ``` $ echo $0 bash ``` ### $* 和 $@ 所有参数 ## declare 命令 ``` declare OPTION VARIABLE=value OPTION -a:声明数组变量。 -f:输出所有函数定义。 -F:输出所有函数名。 -i:声明整数变量,可直接运算 result=val1*val2。 -l:声明变量为小写字母。 -p:查看变量信息。 -r:声明只读变量。 -u:声明变量为大写字母。 -x:该变量输出为环境变量 ``` 如 ``` declare -i ab=123 echo ${ab} // 123 ab="abc" echo ${ab} // 由于只能为整型,赋值字符串变为0 ``` ## readonly 命令 同 `declare -r` ## let 命令 ``` $ let foo=1+2 $ echo $foo 3 $ let "v1 = 1" "v2 = v1++" $ echo $v1,$v2 2,1 ```