标签:Shell 变量 参考 echo shell 格式 name
运行 Shell 脚本有两种方法
作为可执行程序
代码保存为 test.sh,并 cd 到相应目录:
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
作为解释器参数
直接运行解释器,其参数就是 shell 脚本的文件名:
/bin/sh test.sh
/bin/php test.php
Shell 注释
以"#"开头的行就是注释,会被解释器忽略。
sh里没有多行注释,只能每一行加一个#号。
Shell 变量
变量命名赋值
命名规则与java一致。
变量名、等号、值之间不能有空格。其他命令间,均用空格隔开。
a=1;
使用变量
在变量名前面加$,使用定义过的变量。
name=yun
echo $name #输出yun
echo ${name} #推荐加{},帮助解释器识别变量边界
name=lin; #再次给变量赋值,不需使用$符号。
只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
a=1;
readonly a; #只读
a=2; #报错
删除变量
使用 unset 命令可以删除变量。语法:
unset a #删除变量
变量被删除后不能再次使用。unset 命令不能删除只读变量。
变量类型
运行shell时,会同时存在三种变量:
- 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
- shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
Shell 字符串
字符串可以用单引号,也可以用双引号,也可以不用引号。
单引号
str=‘this is a string’
单引号字符串的限制:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
双引号
your_name='qinjx'
str="Hello, I know your are \"$your_name\"! \n"
双引号的优点:
双引号里可以有变量
双引号里可以出现转义字符
拼接字符串
直接拼接,无操作符。
your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo say$greeting $greeting_1
获取字符串长度
操作符#,${#varName}
string="abcd"
echo ${#string} #输出 4
提取子字符串
操作符:,格式:${var:start[:end]};索引从1开始,不含头只含尾。
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo
查找子字符串
格式:`expr index “${var}” substr`
string="runoob is a great company"
echo `expr index "$string" is` # 输出 8
注意: 以上脚本中 “`” 是反引号,而不是单引号 “’”。
也可:expr index $var $substr
Shell 数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。
定义数组
在Shell中,用括号来表示数组,数组元素用"空格"符号分割开。格式:
arr=(val1 val2...)
arr=(1 2 3 4)
arr1[0]=1; arr1[2]=2;
可以不使用连续的下标,而且下标的范围没有限制。
读取数组
${数组名[下标]}
valuen=${arr[0]} #1,大括号括起,帮助区分边界
echo ${arr[@]} #1 2 3 4 下标为@、*符号时,获取数组中的所有元素
获取数组的长度
${#数组名[@/\*]} #获取数组长度
${#数组名[index]} #获取数组单个元素长度
echo ${#arr[@]} #4
echo ${#arr[1]} #1
Shell 基本运算符
算数运算符:+,-,\*(需转义),/,%,=,==,!=
格式:`expr 2 + 2`;expr命令,反引号,表达式和运算符之间必须有空格。
其他形式:$(expr 2 + 2)
$((2 + 2));(())为整数运算符
关系运算符:-eq,-ne,-gt,-lt,-ge,-le
格式:[10 -eq 20],中括号括起,空格。只支持数值。
布尔运算符:!,-o(或),-a(与)
格式:[ 10 -eq 20 -o 1 eq 1],一个中括号,空格
逻辑运算符:||,&&
格式:[[ 10 -eq 20 || 1 eq 1]],两个中括号,空格
字符串运算符:=,!=,-z(长度为0),-n(长度不为0),str([$str],不为空返回true)
格式:[‘aa’ = ‘bb’],[-z $str],,中括号括起,空格
文件测试运算符:
-d/f,目录/文件
-r/w,可读/可写
-x,可执行;-e,存在;-s,非空。
使用$()、$(())、$[]进行数值运算。
可使用[ ]判断结构的地方都可以使用[[ ]];故推荐使用[[ ]]。
对true、false运算时,不加[[ ]]、[ ]。
条件判断结构无法赋值给变量,只能用于if结构。
命令
export命令
格式:export [-fpn][name]=[value];设置/显示环境变量
f,表示name为函数名
p,列出所有环境变量
n,删除变量;实际未删除,只是禁用。
export -f # 列出当前的环境变量值
export JAVA_HOME='/java' # 声明并设置环境变量
help命令
格式:help command;显示帮助
echo命令
格式:echo string
双引号,可引用变量;单引号原样输出。
-e,开启双引号字符串转义。
echo `date`;反引号,显示命令执行结果
echo lalala > 1.txt;标准输出到指定文件。
printf命令
格式:printf “format” str;格式化输出
%s、%c、%d、%f;字符串、字符、十进制整数、浮点数占位符
%-10s,宽度10,-左对齐(无为右对齐)
%-4.2f,.2保留两位小数。
test命令
检查条件是否成立,作用类似[[ ]]。
test ex,[[ ex ]]
Shell流程控制
分支
if
if-then-fi
if-then-else-fi
if-then-elif then-else-fi
else不可为空,如为空则省略else。
case
case 1 in
1) echo 1; ;;
2) echo 2; ;;
*) echo *; ;;
esac; #双分号结束分之前必须有空格
循环
for
for var in v1 v2…vn; do command; done
for((i=1;i<5;i++)); do command; done
while
while exp; do command; done;
i=0;
while (($i<3)); do echo $i; let "i++"; done;
util exp; do command; done;
until [ $i -gt 3 ]; do echo $i; i = `expr $i + 1`; done;
死循环及跳出
while :/true、for (( ; ; ));无限循环
break、continue
Shell函数
格式:[function] fName(){ command; [return int;] }
return 语句返回函数执行结果,正常0,异常1-255。必须为0-255。
function、return语句可省,省去return后返回值为最后一行命令的结果。
函数中可通过变量名,直接引用外部变量。
$n,获取第n个参数;n>10,使用${10}格式。
$*、$@,显示所有参数
$#,传递到函数的参数个数
$?,函数外使用,显示最后命令的退出状态。
for i in $*;遍历所有输入参数。
Shell输入输出重定向
格式:command [n] >/>> file
0标准输入,1标准输出,2错误输出。
>/>>,重定向输出/追加重定向输出
<,重定向输入;<<tag,将开始标记tag和结束标记tag间的内容作为输入。
m > &n,将输出文件m和n合并;date 1>file1 2> &1
m < &n,将输入文件m和n合并
command >/dev/null 2> &1 不在屏幕上显示,/dev/null
Shell文件包含
格式:./source file,引入外部脚本。引入后可使用其中的变量。
标签:Shell,变量,参考,echo,shell,格式,name 来源: https://blog.csdn.net/yun6713/article/details/115276749
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。