#
# 变量
#
# --表达式赋值给变量
value=`expr 1 + 2`
echo "两数之和为: $value"
# --乘法较为特殊
value_div=`expr 1 \* 2`
echo "两数之积为: $value_div"
# --变量计算
variable_cal=$[ value + value_div ] #等号两边不能有空格
echo $variable_cal
#
# 流程控制
#
# --流程控制 if else
if [ $value != $value_div ]; then
echo "value值不等于value_div"
else
echo "value值等于value_div"
fi
# --流程控制 if else-if else
:<<EOF
if condition1
then
command1
elif condition
then
command2
else
fi
EOF
# --多行注释
:<<EOF
我在这里注释了一段很长的话
这段话是一段多行的提示性文字
...
EOF
# --数组声明及元素访问等
array=("h" "e" "l" "l" "o" "world")
echo "[1] 数组array的所有元素为:${array[@]}"
echo "[2] 数组array的所有元素为:${array[*]}"
echo "数组array的元素个数为:${#array}"
echo "数组array的第二元素个数为:${array[1]}"
echo "数组array的最后一个元素的长度为:${#array[5]}"
# --流程控制 for循环
echo "当前文件夹下的文件名称:"
echo "=============================================="
for filename in `ls ./`
do
echo "${filename}"
done
echo "=============================================="
# --流程控制 for in
:<<EOF
for var in item1 item2 item3 ... itemN
do
command
done
EOF
# --流程控制 while循环
echo "输出小于等于5的正整数:"
int=1
while((int<=5))
do
echo $int
let "int++" #bash let用于执行一个或多个表达式
done
# --while可用于读取键盘信息
echo "按下 <ctrl + d>退出"
echo -n "请输入任意一个字符:"
while read FILM
do
echo "你输入的是: ${FILM}"
done
# --流程控制 until循环
# until 循环执行一系列命令直至条件为 true 时停止。
# until 循环与 while 循环在处理方式上刚好相反。
:<<EOF
until condition
do
command
done
EOF
# --无限循环
:<<EOF
while :
do
command
done
#------------
while true
do
command
done
#------------
for (( ; ; ))
EOF
# --break和continue可用于结束循环和跳出当前循环
#
# echo 命令
#
# 显示普通字符串
echo "normal string"
# 显示转义字符串
echo "Say \"hello\"!"
# 显示换行 -e 开启转义
echo -e "Mission complete!\n"
# 显示不换行 \c 不换行
echo "First line \c"
echo "Second line" # result: First line Second line
# 内容定向至文件(覆盖)
echo "String..." > ./override_string.log
# 内容定向至(追加)
echo "String..." >> ./append_string.log
# 显示命令执行结果
echo `date`
#
# read 命令
#
# 输入提示文字
read -p "请输入一段字符:"
# 输入字符长度限制
read -n 6 #长度为6位
# 输入超时限制
read -t 6 #超时时长6秒
# 输入隐藏内容
read -s password
echo "input password: ${password}"
#
# test 命令
#
# 数值测试
:<<EOF
参数 说明
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真
EOF
number1=100
number2=200
if test $[number1] -eq $[number2]
then
echo "两个数不相等"
else
echo "两个数相等"
fi
# 字符串测试
:<<EOF
参数 说明
= 等于则为真
!= 不相等则为真
-z 字符串 字符串的长度为零则为真
-n 字符串 字符串的长度不为零则为真
EOF
string1="abc"
string2="bcd"
if test $string1 = $string2
then
echo "两个字符串相等"
else
echo "两个字符串不相等"
fi
# 文件测试
:<<EOF
参数 说明
-e 文件名 如果文件存在则为真
-r 文件名 如果文件存在且可读则为真
-w 文件名 如果文件存在且可写则为真
-x 文件名 如果文件存在且可执行则为真
-s 文件名 如果文件存在且至少有一个字符则为真
-d 文件名 如果文件存在且为目录则为真
-f 文件名 如果文件存在且为普通文件则为真
-c 文件名 如果文件存在且为字符型特殊文件则为真
-b 文件名 如果文件存在且为块特殊文件则为真
EOF
if test -e ./override_string.log
then
echo "override_string.log文件存在"
else
echo "override_string.log文件不存在"
fi
# 另外,Shell还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,
# 其优先级为:"!"最高,"-a"次之,"-o"最低
# 与 或 非
if test -e ./override_string.log -o -e ./append_string.log
then
echo '至少有一个文件存在!'
else
echo '两个文件都不存在'
fi
#
# 函数
#
# 定义一个函数
funcEchoString(){
echo "这是一个函数"
}
echo "==========函数执行开始==========="
funcEchoString
echo "==========函数执行结束==========="
# 带返回值的函数
funcWithReturn(){
func_value1=1
func_value2=2
return ($func_value1+$func_value2)
}
echo "==========函数执行开始==========="
funcWithReturn
echo "函数的执行结果是: $?" #函数返回值在调用该函数后通过 $? 来获得
echo "==========函数执行结束==========="
# 函数参数
funcWithParam(){
echo "调用此函数的第一个参数是 ${1} "
echo "调用此函数的第二个参数是 ${2} "
#...
echo "调用此函数的所有参数是 $* " #所有参数组成的字符串
echo "调用此函数的所有参数个数是 $# "
}
echo "==========函数执行开始==========="
funcWithParam 1 2 3
echo "==========函数执行结束==========="
:<<EOF
参数处理 说明
$
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
EOF
#
# 文件包含
#
. ./other_shell.sh # 注意点号(.)和文件名中间有一空格
# 或
source ./other_shell.sh
#
# 输入/输入重定向
#
:<<EOF
命令 说明
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 之间的内容作为输入。
EOF
# 文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)
# 一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
# 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
# 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
# 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
# 如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写:
echo "string" > file 2>&1
# 或者
echo "string" >> file 2>&1
# 这里的&没有固定的意思
# 放在>后面的&,表示重定向的目标不是一个文件,而是一个文件描述符
# 而&>file是一种特殊的用法,也可以写成>&file,二者的意思完全相同
# 此处&>或者>&视作整体,分开没有单独的含义
#
# sed命令
#
# 查找替换
sed 's/hello/hi/g' example-file.txt
# 执行批量命令
sed -e 's/hello/hi/g' -e 's/world/century/g' example-file.txt
# 替换原文件
sed -i -e 's/hello/hi/g' -e 's/world/century/g' example-file.txt
#
# awk命令
#
awk -F '分隔符' '/正则表达式/{action动作}' 文件
awk -F ':' '/root/{print $1}' /etc/passwd
# output: root
