目录
1.定义执行环境
如#!/bin/bash是指定该脚本由/bin/bash来运行。
2.shell中的特殊符号
! 执行历史命令,!!执行上一条命令
& 后台执行
* 默认是通配符,如果想作为乘号,需要转义,如 expr 3 \* 3
$? 返回上一条命令是否执行成功,0代表成功,其他代表失败。
` ` 反引号,用于在命令中执行命令,如 echo " Date: `date +%F` "
' ' 单引号代表字符串,但不同于双引号的是,单引号不解释变量。
如 echo '$USER' 输出 $USER
echo "$USER" 输出 root
echo ''$USER'' 输出 root (这边是连续输入两次单引号)
" " 双引号代表字符串。
更多特殊符号,参考:shell中的特殊符号
3.重定向
> 输入,覆盖之前的输入
>> 追加输入,追加到原来输入的内容之后
< 输出,如 wc < text.txt
<< 追加输出。可用于多行数据追加输入,也可用于自动执行交互式命令。如:
CASE1:通过追加输出,将多行数据重定向到spark-shell命令
#追加输出的内容可以写在左右括号(EOF或者END代表左右括号)之间
spark-shell << EOF
#scala脚本
EOF
skill: 在EOF脚本中获取环境变量
注意,如果希望在如上的scala脚本中使用shell中的变量,则可以通过export将变量声明为环境变量,再通过scala的sys.env("环境变量名")获取。
CASE2:通过追加输出,实现自动化交互
#需要交互的命令顶格写进去
fdisk /dev/sdb << END
n
p
3
+204M
q
END
4.管道
把一个命令的输出作为下一个命令的输入,以这种方式连接的两个或者多个命令就形成了管道(pipe)。
重定向操作符>将命令与文件连接起来,用文件来接收命令的输出;而管道符|将命令与命令连接起来,用第二个命令来接收第一个命令的输出。
CASE:读取文件到内存
cat file | while read line
do
echo $line
done
5.运算
-
四则运算等
expr 1 + 2; expr 1 - 2; expr 1 \* 2; expr 1 / 2
$((10**3)) #3次方; $(((1+1*5)/4));$((3%2))
bc命令也可以用于计算,需要先安装bc:yum -y install bc
-
大小比较运算
-eq 等于;-gt 大于;-lt 小于;-ge 大于等于;-le 小于等于;-ne 不等于
如,test num1 -eq num2;echo $?
if [[ $? -ne 0 ]];then
echo "Failed!"
fi
-
字符串比较运算
-z 字符串长度是否为0
-n 长度是否大于0
== 等于
!= 不等于
if (( "a" == "a" ));then
echo "true"
fi
-
逻辑运算
&& 逻辑与 if [ 1 -eq 1 ] && [ 2 -eq 2 ];then echo "true";else echo "false";fi
|| 逻辑或
! 逻辑非
-
赋值运算
= 赋值
-
文件比较与检查
-d 目录是否存在
-f 文件是否存在
-e 目录或文件是否存在
-r 检查文件是否存在且可读
-s 检查文件是否存在且不为空
-w 检查文件是否存在且可写
-x 检查文件是否存在且可执行
-O 检查文件是否存在且被当前用户拥有
-G 检查文件是否存在且默认组为当前用户组
file1 -nt file2 检查file1是否比file2新,比较的是修改时间
file1 -ot file2 检查file1是否比file2旧,比较的是修改时间
file1 -ef file2 检查两个文件的Inode是否相同,如果是硬连接,则相同。
6.字符串截取等操作
6.1字符串截取:
- 常见的8种字符串截取方法:
${var#*/}
${var##*/}
${var%/*}
${var%%/