Shell必备基础(1)
Posted by 付辉 on Thursday, August 9, 2018 共993字Shell
是对Linux
命令的深加工,用得好,事半功倍。 本来只想加深Array
的用法,但一不小心,又变成了一篇基础大全。
比较运算
习惯在if
语句中使用[[...]]
对条件进行比较,字符串、数值以及文件,统统笑纳。
算数比较
常用的操作符有-eq
、-ne
、-gt
、-lt
、-le
等。
文件系统
当编译文件、或者查看pid
文件、日志时会经常用到。
[ -e $var ] 如果指定的变量包含的文件存在,则返回真
[ -f $var ] 如果指定的变量包含正常的文件路径或文件名,则返回真
字符串比较
判空还是相当常见的操作。比如,查看当前系统是否启用了notify
的进程,如果有的话,kill
掉。
pid=`ps -ef | grep notify | grep -v 'grep' | awk '{print $2}'`
if [[ -n $pid ]]
then
echo -e "\033[31m Kill掉当前正在运行的进程... \033[0m\n"
kill $pid
fi
常见的操作符如下:
[[ -z $str ]] 如果str包含的是空字符串,则返回真
[[ -n $str ]] 如果str包含的是非空字符串,则返回真
其他的操作符包括:==
、!=
、>
、<
逻辑运算
使用逻辑&&
和||
来表示与和或的逻辑关系。
比如
if [[ -n $str ]] && [[ -z $str ]]
then
echo $str
fi
基本语句Example
if
语句
if command1
then
# ...
elif command2
then
# ...
else
# ...
fi
while
语句
while [ 1 ]
do
echo $RANDOM
done
for
语句
for
循环总是以空格、\t
、\n
作为分隔符。如果要明确指定分隔符的话,使用IFS
明确声明。
SERVER=(
# server list
"node025.add.neojos.net"
"node026.add.neojos.net"
"node062.add.neojos.net"
"node063.add.neojos.net"
)
#${SERVER[@]}其实就是一个用空格implode起来各个元素的组合字符串
for var in ${SERVER[@]}
do
echo $var;
done
case
语句
case $OPT in
i)
NEED_BUILD=false
;;
b)
BUILD_FILE=$OPTARG
;;
esac
数组
定义一个数组,元素间使用空格或者\n
进行分隔。
task=("delivery" "notify" "event")
要访问其中的元素,需要知道它的下标:
echo ${task[0]} ${task[1]}
经常会用到的获取数组的方式(*
可以用来替换@
):
${task[@]} #数组所有元素的value
${!task[@]} #数组所有元素的key
${#task[@]} #数组元素的个数
下面列举几个简单的例子:
#!/bin/bash
arr=(
one
two
three
[6]=six
)
echo "Array size :" ${#arr[@]}
# Array size : 4
函数
函数的声明:
function deploy()
{
# 在函数体内部,通过 $n 的形式来获取参数的值
server=$1;
echo -e "start deploy \033[0;34m$server\033[0m; put y to continue, put n to quit:"
read line
if [ "$line" != "y" ]; then
return
fi
}
函数的调用。函数名会在$0
变量中定义,函数命令行上的任何参数都需要通过$1
,$2
…来定义。还可以通过$#
来判断参数的个数。
for server in "${SERVER[@]}"
do
deploy $server
done
获取参数的具体形式:
$# 传递到脚本的参数个数
$* 以一个单字符串形式向脚本传递参数。如果是"$*",会输出"$1 $2 … $n"的形式。
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
参考文章: