美文网首页
Shell 学习

Shell 学习

作者: 如逆水行舟不进则退 | 来源:发表于2020-09-18 16:56 被阅读0次
  • shell 变量
#!/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
!
  • shell 参数传递
#!/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
  • shell 数组
#!/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]}
  • shell 运算符
#!/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
  • shell echo 命令
#!/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`
  • printf命令
#!/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" #警告字符
  • test 命令
#!/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
  • shell 函数
#!/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

相关文章

网友评论

      本文标题:Shell 学习

      本文链接:https://www.haomeiwen.com/subject/fcvjyktx.html