#!/bin/bash
# 1.shell 变量
your_name="yangchuankun"
echo $your_name
readonly your_name
your_name="ckyang"
#unset your_name
echo ${your_name}
echo "hello world!"
# 2.shell 字符串
echo 'hello string'
echo "hello\" ${your_name}\""
echo 'hello ${your_name}'
# 字符串长度
echo ${#your_name}
# 截取字符串
echo ${your_name:1:4}
# 查找字符串
echo `expr index "$your_name" a`
# 3.shell 数组
array_name=(value0 value1 value2 value3)
echo ${array_name[0]}
echo ${array_name[@]}
echo ${#array_name[*]}
echo ${#array_name[0]}
# 4.多行注释
:<<!
echo 1
echo 2
echo 3
echo 4
!
#!/bin/bash
# shell 传递参数
echo "shell 传递参数示例"
echo "执行文件名: $0"
echo "第一个参数:$1"
echo "第二个参数:$2"
echo "第三个参数:$3"
echo $#
echo $*
echo $$
echo $!
echo $@
echo $-
echo $?
# $* 和 $# 区别
# 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。
echo "--- \$* 演示 ---"
for i in "$*"; do
echo $i
done
echo "--- \$@ 演示 ---"
for i in "$@"; do
echo $i
done
#!/bin/bash
# shell 数组
my_array[0]=A
my_array[1]=B
my_array[4]=C
echo "数组的个数为:${#my_array[*]}"
echo ${my_array[0]}
echo ${my_array[@]}
echo ${my_array[2]}
#!/bin/bash
# shell 基本运算符
#1.算数运算符
a=10
b=20
echo "1.算数运算符"
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ] #必须带空格 方括号和变量之间也需要
then
echo "a 等于 b"
fi
if [ $a != $b ]
then
echo "a 不等于b"
fi
#2.关系运算符
echo "2.关系运算符"
if [ $a -eq $b ]
then
echo "$a 等于 $b"
fi
if [ $a -ne $b ]
then
echo "$a 不等于 $b"
fi
if [ $a -gt $b ]
then
echo "$a 大于$b"
fi
if [ $a -lt $b ]
then
echo "$a 小于 $b"
fi
if [ $a -ge $b ]
then
echo "$a 大于等于 $b"
fi
if [ $a -le $b ]
then
echo "$a 小于等于 $b"
fi
#3.布尔运算符
echo "3.布尔运算符"
if [ $a -lt 100 -a $b -gt 15 ]
then
echo "$a 小于 100 且 $b 大于 15"
fi
if [ $a -lt 100 -o $b -gt 30 ]
then
echo "$a 小于100 或 $b 大于 30"
fi
#4.逻辑运算符
echo "4.逻辑运算符"
if [[ $a -lt 100 && $b -gt 15 ]]
then
echo "$a 小于 100 且 $b 大于 15"
fi
if [[ $a -lt 100 || $b -gt 30 ]]
then
echo "$a 小于100 或 $b 大于 30"
fi
#5.字符串运算符
echo "5.字符串运算符"
c="abc"
d="efg"
if [ $a == $b ]
then
echo "$a == $b "
fi
if [ $a != $b ]
then
echo "$a != $b"
fi
if [ -z $a ]
then
echo "$a 长度为0"
fi
if [ -n "$a" ]
then
echo "$a 长度不为0"
fi
if [ $a ]
then
echo "$a 不为空"
fi
#6.文件测试运算符
echo "6.文件测试运算符"
file="/search/odin/yangchuankun/shell/operator.sh"
if [ -r $file ]
then
echo "文件可读"
else
echo "文件不可读"
fi
if [ -w $file ]
then
echo "文件可写"
else
echo "文件不可写"
fi
if [ -x $file ]
then
echo "文件可执行"
else
echo "文件不可执行"
fi
if [ -f $file ]
then
echo "文件为普通文件"
else
echo "文件为目录or 设备文件"
fi
if [ -d $file ]
then
echo "文件为目录"
else
echo "文件不是目录"
fi
if [ -s $file ]
then
echo "文件不为空"
else
echo "文件为空"
fi
if [ -e $file ]
then
echo "文件存在"
else
echo "文件不存在"
fi
#!/bin/bash
# echo 命令
# 显示变量
echo "1.显示变量"
read name
echo "$name it is a test"
# 显示换行
echo "2.显示换行"
echo "OK! \n"
echo -e "OK! \n" # 不加 -e 不转义
echo "It is a test"
echo "3.显示不换行"
echo "OK! \c" # 不加 -e 不转义
echo -e "OK! \c"
echo "it is a test"
echo "4.显示结果定向到文件"
echo "it is a test" > myfile # 文件不存在则创建
echo "5.原样输出字符串,不进行转移或取变量(用单引号)"
echo '$name\"'
echo "6.显示命令执行结果"
echo `date`
#!/bin/bash
echo "printf命令"
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
# format-string 为双引号
printf "%d %s \n" 1 "abc"
# 单引号和双引号效果一样
printf '%d %s \n' 1 "abc"
# 没有引号也可以输出
printf %s abcd
# 格式只制定了一个参数,但是多出的参数仍然会按照该格式输出,format-string 被重用
printf %s abc edf
printf "%s\n" abc def
printf "%s %s %s\n" a b c d e f g
# 如果没arguments , 那么%s 用null 代替, %d 用0代替
printf "%s and %d \n"
printf "a string , no processing:<%s>\n" "A\nB"
printf "a string , no processing:<%b>\n" "A\nB" # %b展开参数中的反斜杠转义字符
printf "abc string \a" #警告字符
#!/bin/bash
# Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
echo "1.数值测试"
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo "两数相等"
else
echo "两数不相等"
fi
echo "代码中的 [] 执行基本的算数运算,如:"
a=5
b=6
result=$[a+b]
echo "result 为 $result"
echo "2.字符串测试"
string1="abc"
string2="abd"
if test $string1 = $string2
then
echo "两字符串相等"
else
echo "两字符串不相等"
fi
echo "3.文件测试"
cd /bin
if test -e ./bash
then
echo "文件存在"
else
echo "文件不存在"
fi
# Shell 还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为: ! 最高, -a 次之, -o 最低。
cd /bin
if test -e ./notfile -o -e ./bash
then
echo "至少一个文件存在"
else
echo "两个文件都不存在"
fi
#!/bin/bash
echo "流程控制"
echo "1.if then else if 结构 前面很多不示例"
echo "2.for 循环"
for loop in 1 2 3 4 5
do
echo "the value is : $loop"
done
for str in 'this is s string'
do
echo $str
done
echo "3.while 循环"
int=1
while(( $int<=5 ))
do
echo $int
# let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量
let "int++"
done
# 读取键盘信息
:<<EOF
echo "按下<CTRL-D>退出"
echo -n "输入你最喜欢的网站名" # echo -n 不换行输出
while read FILM
do
echo "是的,$FILM 是一个好网站"
done
EOF
# 无限循环
# while : 或 while true 或 for (( ; ; ))
echo "4.until循环"
# until 循环执行一系列命令直至条件为 true 时停止。
a=0
until [ ! $a -lt 10 ]
do
echo $a
a=`expr $a + 1`
done
echo "4.case 结构"
# case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令
:<<EOF
echo "请输入1到4之间的数字"
echo "你输入的数字为:"
read aNum
case $aNum in
1) echo '你选择了1'
;;
2) echo '你选择了2'
;;
3) echo '你选择了3'
;;
4) echo '你选择了4'
;;
# 如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
*) echo '你没有输入 1到4 之间的数字'
;;
esac
EOF
echo "5.break"
:<<EOF
while :
do
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
break
;;
esac
done
EOF
echo "6.continue"
:<<EOF
while :
do
echo -n "输入 1 到 5 之间的数字: "
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的!"
continue
echo "游戏结束"
;;
esac
done
EOF
#!/bin/bash
# shell 函数
demoFun(){
echo "这是我第一个shell函数"
}
demoFun
funWithReturn(){
echo "这个函数会对输入的两个数字相加"
echo "输入第一个数字:"
read aNum
echo "输入第二个数字:"
read bNum
echo "两个数字分别为 $aNum 和 $bNum"
return $(($aNum+$bNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !" # 函数返回值在调用该函数后通过 $? 来获得。
funWithParam(){
echo "第一个参数为 $1"
echo "第二个参数为 $2"
echo "第十个参数为 $10 "
echo "第十个参数为 ${10}"
echo "第十一个参数为${11}"
echo "参数总数有 $# 个"
echo "作为一个字符串输出所有参数 $* "
}
funWithParam 1 2 3 4 5 6 7 8 9 111 222
网友评论