Shell运行环境
登录到linux就有个登录shell
可以在此登录shell中执行语句,也可以执行shell脚本(开个子shell执行shell语句);
与环境有关系的指令:
- export var 在任何子shell中均有该变量的拷贝
子shell继承了父shell, 但子shell不能影响父shell的变量值;
- source var 当前shell 中执行命令;
变量
var=value #变量定义不能有空格; 变量的二次赋值不能用$var,直接用变量名则可。
unset var #变量的删除
#变量的使用()
$var
${var} #增加变量名边界的定位
shell变量、局部变量、环境变量
局部变量:当前shell实例可用的变量;
环境变量:所有的程序,包含shell启动的程序都能访问的变量;
Shell变量:前面两种的总称!
/etc/bashrc vs /etc/profile中的环境变量关系?
整数
暂无
字符串
字符串形式:
- 单引号:
不能包含变量; 原样输出;
- 双引号:
可以包含变量;可以有转义字符;可以包含单引号;
各种操作
- 拼接:把字符串/变量连在一起就行了(不需要任何符号)
- 长度:${#strval}
- 截串:${string:1:4}
- 查找子串:
expr index "$string" u
数组
只支持一维数组
Array=(1 2 3 4),值之间的隔离用 空格或者换行。
各种操作:
- 单个元素获取:${array[0]}
- 获取全部元素: arrayname[@] {array_name[*]}
- 数组的长度:{#array_name[@]} 或者{#array_name[*]}
- 单个元素的长度:lengthn=${#array_name[n]}
参数
参数名 | 意义 |
---|---|
$# | 传递到脚本的参数个数 |
$* | |
$@ | |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
$0 | Shell脚本名 |
$1 … | 第1个参数,。。 |
∗ @
#
function showDollarVar()
{
echo '-------------$*'
for arg in $*
do
echo $arg
done
echo '-------------"$*"'
for arg in "$*"
do
echo $arg
done
echo '-------------$@'
for arg in $@
do
echo $arg
done
echo '-------------"$@"'
for arg in "$@"
do
echo $arg
done
}
showDollarVar "hua jiang hu" zhi
root@shellLang# ./grammar.sh
-------------$* #以一个单字符串的形式显示所有向脚本传递的参数。
hua
jiang
hu
zhi
-------------"$*" #全部参数视为一个整体
hua jiang hu zhi
-------------$@ #同于没有加“”的$*
hua
jiang
hu
zhi
-------------"$@" #原始参数一个个解析出来(默认为空格)
hua jiang hu
zhi
分支控制
要将分支控制的助词如then, do提前一句,那么需要在前一句话后加分号;再加此助词。
如
if []; then
..
fi
for [] ; do
..
done
if
if [ $a -eq $b ]
then
echo $a "==" $b
elif [ $a -gt $b ]; then
echo $a ">" $b
else
echo $a "<" $b
fi
for
#for ((i=0; i<5; i++))
#for (( i=0; i<5; i++ ))
for i in 0 1 2 3 4 #只能空格为间隔,加,则会解释成数据
do
echo 'hello', $i
done
while
#while(($a<=3)) ##cant use -le
while [ $a -le 3 ]
do
echo $a
let "a++"
done
死循环
while(true)
while [ true/1/false ]
for ((;;))
函数
形式如下
# 不带任何参数
# /bin/sh不能带function关键字,/bin/bash则可有可无function
[ function ] funname [()]
{
action;
# 如果不加,将以最后一条命令运行结果,作为返回值。
[return int;] #return后跟数值n(0-255)
}
运算符
- 算术运算符
+、-、*、/、%、=、==、!=
原生的bash不支持,得借助(let,expr,..)之类的表达式计算工具。
let a=a+1
`expr $a + $b` #注意:表达式与运行符号之间必须要空格。
# 注意:乘号*需要转义。
- 字符串运算符
=判等、!=
-z长度是否为0、-n长度是否不为0
str是否不为空(这点如下)。
if [ $string ]; then
echo ‘string not empty’
fi
布尔运算符
!非、-o或、-a与
逻辑运算符
&&逻辑与、||逻辑或
test测试
- 数值测试:
- -eq等于则为真、-ne
- -gt大于, -lt
- -ge大于等于、-le
- 字符串测试:
- =, !=,
- -z –n
文件测试:
- -e文件存在
- -f文件存在且为普通文件
- -r, -w, -x, -s, -d, -c, -b
文件测试运算符:[ -r $file ]
-r file 检测文件是否可读,如果是,则返回 true。
-w file 检测文件是否可写,如果是,则返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。
-d file 检测文件是否是目录,如果是,则返回 true。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。
-b file 检测文件是否是块设备文件,如果是,则返回 true。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。
-p file 检测文件是否是有名管道,如果是,则返回 true。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。
输入、输出
Echo
Echo –e “…\x” 开启转义
Echo –e “…\c” 不换行
printf 比echo更强大,移植性更好;
printf format-string [arguments...]
0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。
输入出重定向
n >& m 将输出文件 m 和 n 合并。
n <& m 将输入文件 m 和 n 合并。
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。
$ command > /dev/null 2>&1