#!/usr/bin/bash # #!是一个约定的标记,告诉系统这个脚本需要什么解释器来执行
echo "shell test start -----"
echo "---------- 定义变量 ----------"
# 定义变量
country="china"
num=100
echo "---------- 使用变量 ----------"
# 使用变量:${}
echo "country name is : ${country}"
echo "num is : ${num}"
echo "---------- 命令替换 反引号 ----------"
# 命令替换,反引号``
dir=`pwd`
echo "dir is : ${dir}"
echo "---------- 特殊变量 ----------"
echo "---------- 当前脚本的文件名 ----------"
echo $0
echo "---------- 传递给脚本的参数,n是一个数字,表示第几个参数----------"
echo "---------- 执行sh test.sh 127.0.0.1 master 输出后面的参数如下 ----------"
echo "---------跟在后面的第一个参数----------"
echo $1
echo "---------- 后面的 第二个参数----------"
echo $2
echo "---------- 输出传递给脚本的参数个数 ----------"
echo $#
echo "---------- 输出传递给脚本的所有参数 ----------"
echo $*
echo "---------- 当前shell进程id,当前脚本所在的进程id ----------"
echo $$
echo "---------- shell 中的转义 ----------"
echo "---------- 反斜杠 ----------"
echo \\
echo "---------- 把一个命令的输出赋值给一个变量(将命令用反引号引起来)----------"
# 输出当前路径
dir=`pwd`
echo $dir
# 输出当前路径下的ll命令的输出
order=`ls -l`
echo $order
echo "---------- shell 算数运算符:expr, 表达式与运算符之间要有空格 ----------"
a=10
b=20
echo "---------- 加 ----------"
expr $a + $b
echo "---------- 减 ----------"
expr $a - $b
echo "---------- 乘,expr中的乘号为:\* ----------"
expr $a \* $b
echo "---------- 除 ----------"
expr $a / $b
echo "---------- 取余 ----------"
expr $a % $b
echo "----------shell中的字符串 ----------"
echo "----------单引号中的任何字符都会原样输出,单引号字符串中的变量无效,其中不能出现单引号,转义后也不行 ----------"
echo "----------双引号中可以有变量,双引号里可以出现转义字符 ----------"
echo '---------- [ $a == $b ]: 相等,比较两个数字相同则返回true ----------'
# echo [ $a == $b ]
echo "---------- [ $a != $b ] : 不相等,比较两个数字,不相同则返回true ----------"
# echo [ $a != $b ]
echo "---------- 赋值:将变量b的值赋值给a ----------"
a=$b
echo $a
echo "---------- 拼接字符串 ----------"
coun="china"
echo "hello, ${coun}"
echo "---------- 获取字符串长度 ----------"
my_str="abcd"
echo ${#my_str}
echo "---------- 提取子字符串 ----------"
large_str="china is a great country!"
echo "---------- 计算字符串长度 ----------"
echo `expr length "$large_str"`
echo $large_str
echo '输出 echo ${large_str::5}'
echo ${large_str::5}
echo '输出 echo ${large_str:1:5}'
echo ${large_str:1:5}
echo '输出 ${large_str:2:6}'
echo ${large_str:2:6}
echo "---------- 查找子字符串??? ----------"
echo `expr index "$large_str" n`
echo "---------- 处理路经的字符串: ----------"
echo "---------- 例:当一个路径为 /home/xiaoming/1.txt时 ----------"
echo "---------- 得到文件名使用 basename命令 ----------"
res=`basename /home/xiaoming/1.txt`
echo $res
echo "---------- basename -a 表示处理多个路径 ----------"
txt_path="/home/xiaoming/1.txt"
sh_path="/home/xiaoming/2.sh"
ret=`basename -a "$txt_path" "$sh_path"`
echo $ret
echo "---------- basename -s 用于去掉指令的文件的后缀名 ----------"
txt_path="/home/xiaoming/1.txt"
result=`basename -s .txt "$txt_path"`
echo $result
echo "---------- 得到路径,不带文件名,使用dirname命令 ----------"
txt_path="/home/xiaoming/1.txt"
sh_path="/home/xiaoming/2.sh"
ret=`dirname "$txt_path"`
echo $ret
echo "---------- 处理多个路径 ----------"
res=`dirname "$txt_path" "$sh_path"`
echo $res
echo "---------- shell 用括号表示数组,元素之间用空格分开,只支持一维数组,下标从0开始,----------"
my_array=("xiaoming" "xiaoxue" "xiaohua" "xiaomei")
echo "读取数组的全部元素,使用@或*"
echo ${my_array[*]}
echo ${my_array[@]}
echo '---------- 读取某个下标的元素: ${array_name[index]} ----------'
echo ${my_array[0]}
echo ${my_array[1]}
echo ${my_array[2]}
echo ${my_array[3]}
echo '---------- 获取数组元素的个数:${#array_name[*]} ----------'
echo ${#my_array[*]}
echo '---------- 获取数组元素的下标:${!array_name[*]} ----------'
echo ${!my_array[*]}
echo '---------- 获取数组单个元素的长度:${#array_name[n]} ----------'
echo ${#my_array[0]}
echo "---------- shell printf函数用法 ----------"
echo "1,printf命令不用加括号"
echo "2,format-string 可以没有引号,最好加上,单双引号均可"
echo "3,参数多于格式控制符(%)时,format-string可以重用,可将所有参数都转换"
echo "4,arguments使用空格分隔,不用逗号"
printf "name = %s, age = %d" "xiaoming" 18
echo "---------- 重点:shell中的条件语句 ----------"
echo "---------- if 语句: ----------"
echo 'if [表达式] then 语句 fi'
echo 'if [表达式] then 语句 else 语句 fi'
echo 'if [ 表达式] then 语句 elif[ 表达式 ] then 语句 elif[ 表达式 ] then 语句 …… fi'
a=10
b=20
if [ $a == $b ]
then
echo "a = b"
else
echo "a != b"
fi
echo "---------- for 循环语句 ----------"
for num in 1 2 3 4 5
do
echo "num is: $num"
done
echo "---------- 显示主目录一下的文件 ----------"
for f in $HOME/*
do
echo $f
done
echo "---------- while循环 ----------"
COUNT=0
while [ $COUNT -lt 5 ]
do
COUNT=`expr $COUNT + 1`
echo $COUNT
done
echo "---------- until循环:循环执行一系列命令,直至条件为true时停止 ----------"
echo "---------- unitl循环与while循环在处理方式上刚好相反 ----------"
NUM=5
until [ $NUM -ge 10 ]
do
NUM=`expr $NUM + 2`
echo $NUM
done
echo "---------- shell 函数:shell函数必须先定义后使用 ----------"
echo "注意点1,调用函数只需要给出函数名,不需要加括号 ----------"
echo "注意点2,函数返回值,可以显示增加return语句;如果不加,会将最后一条命令运行结果作为返回值 ----------"
echo "注意点3,shell函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败 ----------"
echo '注意点4,函数参数可以通过$n得到 ----------'
function my_func(){
echo "my first function ------"
echo "first param is : $1"
echo "first param is : $2"
echo "params count is : $#"
echo "all param is : $*"
}
my_func 'hehe' 'haha'
echo "---------- shell文件包含:source filename 将外部脚本的内容合并到当前脚本,被包含脚本不需要执行权限 ----------"
# source /mnt/shell/test01.sh
echo "---------- ----------"
echo "---------- ----------"
echo "---------- ----------"
echo "---------- ----------"
echo "---------- ----------"