Shell学习(一)
2019-03-06 本文已影响1人
苦行小哥哥
title: shell学习(一)
time: 2018.3.1 星期五 16:11
变量
- 变量与变量的内容以 '=' 来连接。
- 等号两边都不能直接接空格。
- 变量命名要求 ,不能以数字开头,由数字和英文字母组成。
- 有空格符可以以单引号或者双引号将变量内容结合起来。
- 双引号内的特殊字符如 $ 可以保持原来的1意思。
- 单引号内的特殊字符则仅为一般字符(纯文本)。
- 可用转义字符 ’\‘ 将特殊符号转义为1一般字符.
- 在一串命令中需要通过其他命令提供的信息。可使用反单引号或者$ ;反单引号为键盘上方的数字键盘1左边的按键。
- 若变量为了增加变量的内容。可使用 ‘$变量名称’ 或者 ’${变量名称}‘累加内容,以:作为后缀。
- export 使变量成为环境变量。
- unset 取消设置环境变量A
查看自己的系统支持哪些shell
/etc/shell
传递参数
- $0 执行的文件名字
- 向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
参数处理 | 说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 |
$- | 显示当前shell使用的当前选项 |
$? | 显示最后命令的退出状态 0 表示没有任何错误。其他任何值表明有错误。 |
@ 不同:前者 “1,2,3” 后者 “1”,“2”,“3”
数组
- 定义
array_name={value0,value1...}
- 引用
${array_name[index]}
- 数组长度
${#array_name[*]}
${#array_name[@]}
基本运算符
算术运算符
- expr 使用反引号 不是单引号
val=`expr 2 + 2` #两个数相加 + 号左右要有空格
- 算术运算符
- , -, * , / ,%, = , ==, !==
乘号 * 需要 反斜号 \ 转义
- , -, * , / ,%, = , ==, !==
- == 与 !=
$a == $b
$a != $b
关系运算符
- 关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
运算符 | 说明 |
---|---|
-eq | 两个数是否相等 |
-ne | 两个数是否不相等 |
-gt | 检测左边的数是否大于右边的 |
- lt | 检测左边的数是否小于右边的 |
-ge | 检测左边的数是否大于等于右边的 |
-le | 检测左边的数是否小于等于右边的 |
$a -eq $b
布尔运算符
运算符 | 说明 |
---|---|
! | 非运算 |
-o | 或运算 |
-a | 与运算 |
逻辑运算符
运算符 | 说明 |
---|---|
&& | 逻辑的AND |
|| | 逻辑的OR |
字符串运算符
运算符 | 说明 |
---|---|
= | 两个字符串是否相等 |
!= | 两个字符串是否不相等 |
-z | 检测字符串是否长度为0 为0 返回 true |
-n | 检测字符串是否长度为0 不为0 返回 true |
$ | 检测字符串是否为空 不为空返回true |
文件测试运算符
操作符 | 说明 |
---|---|
-b file | 检测文件是否是块设备文件 是返回true |
-c file | 检测文件是否为字符设备文件 是返回true |
-d file | 检测文件是否是目录 是返回true |
-f file | 检测文件是否为普通文件(不是目录 也不是设备文件)是 返回 true |
-g file | 检测文件是否设置了 SGID位 是返回true |
-k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 |
-p file | 检测文件是否是有名管道,如果是,则返回 true。 |
-u file | 检测文件是否设置了 SUID 位,如果是,则返回 true。 |
-r file | 文件是否可读 |
-w file | 文件是否可写 |
-x file | 文件是否可执行 |
-s file | 文件是否为空 |
-e file | 检测文件(目录)是否存在 是返回true |
echo
#显示换行
echo -e "hello \n"
#显示不换行
echo -e "hello \c" #-e 开启转义 \c 不换行
#显示结果定向至文件
echo "hello" > file
#原样输出字符串 不进行转义或取变量 用单引号
echo ' string'
#显示命令执行结果 用反引号
echo `date`
printf
- 格式
printf format-string [arguments.....]
- 类比c语言printf 多一个 - 指定对齐方式
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
- 表示左对齐 没有则右对齐
printf "%d %s\n" 1 "abc"
# 单引号和双引号一样
# 没有引号也可以输出
- printf的转义序列
序列 | 说明 |
---|---|
\a | 警告字符,通常为ASCII的BEL字符 |
\b | 后退 |
\c | 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略 |
\f | 换页(formfeed) |
\n | 换行 |
\r | 回车(Carriage return) |
\t | 水平制表符 |
\v | 垂直制表符 |
\ | 一个字面上的反斜杠字符 |
\ddd | 表示1到3位数八进制值的字符。仅在格式字符串中有效 |
\0ddd | 表示1到3位的八进制值字符 |
test 命令
if test $a
流程控制
- if else
if condition
then
command1
elseif condition2
then
command2
else
command3
fi
- for 循环
for var in item1,item2...itemN
do
command1
command1
done
- while
while condition
do
command
done
-until 循环 直到条件为true为止
until condition
do
command
done
-case 多选择语句
case 值 in
模式一)
command1
;;
模式二)
command2
;;
*)
command3
;;
esac
-break
允许跳出所有循环
- continue
跳出当前循环
shell函数
[ function ] funname [()]
{
action;
[return int;]
}
- 在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 1表示第一个参数,$2表示第二个参数...
- 调用 funName 1 2 3
shell 输入/输出重定向
命令 | 说明 |
---|---|
command > file | 将输出重定向到 file。 |
command < file | 将输入重定向到 file。 |
command >> file | 将输出以追加的方式重定向到 file。 |
n > file | 将文件描述符为 n 的文件重定向到 file。 |
n >> file | 将文件描述符为 n 的文件以追加的方式重定向到 file。 |
n >& m | 将输出文件 m 和 n 合并。 |
n <& m 将输入文件 m 和 n 合并。
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。
- 需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
- here Document
command << delimiter
document
delimiter
shell 文件包含
使用 . 号来引用test1.sh 文件
./test1.sh