Hits

Shell脚本编程快速入门

Shell编程快速入门

第一个Shell脚本

#!/bin/bash
echo "Hello World"

命名为: test.sh,运行方法如下:

bash test.sh

chmod +x test.sh
./test.sh

变量

  • 命名

需要注意的是变量名与等号直接不能有空格 name="lg1024"

  • 使用

使用在变量名前添加$即可,{}表示这个变量名的边界 echo $name echo ${name}

  • 只读变量

使用readonly可以将变量定义为只读变量,只读变量不能再次赋值

name="lg1024"
readonly name
  • 删除变量

使用 unset 删除变量,之后不能再使用

name="lg1024"
unset name

字符串

字符串可以使用单引号和双引号,单引号中不能包含单引号,即使转义单引号也不行,双引号中可以包含单引号。

name="lg1024"
echo "my name is $name"
  • 拼接
name="lg1024"
hello="my name is ${name}"
  • 获取字符串长度
str="lg1024"
echo ${#str}  #6
  • 提取子字符串

从字符串的第二个字符开始提取3个字符,从0开始计数,所以结果为102

str="lg1024"
echo ${str:2:3} # 102
  • 查找

查找字符串str中第一个出现字母g的位置,第一个字符从1开始计数

str="lg1024"
echo `expr index "$str" g` # 2

数组

  • 定义
names=("golang" "java" "python")
echo ${names[0]}
echo ${names[2]}
  • 读取

echo ${names[@]} 获取所有元素

  • 获取长度
length=${#names[@]}
length=${#names[*]}

Shell参数传递

执行shell脚本的时候,可以向脚本传递参数,在Shell中获取这些参数的格式为 $n,即 $1, $2, ...,分别表示获取的第一个、第二个参数。

  • $# 传递脚本参数的个数
  • $@ 返回所有参数
  • $? 退出的状态,0表示没有错误,其他表示有错误
# test.sh
echo "第一个参数:$1"
echo "第二个参数:$2"

echo "参数个数:$#"
echo "显示所有参数:$@"
echo $?
# 执行
chmod +x test.sh
./test.sh 12 13 14

运算

算术运算原生bash不支持简单的数学运算,可以借助于其他命令来完成,例如awkexprexpr是一款表达式计算工具,使用它能完成表达式的求值操作。

echo "val=`expr 2 + 2`" > test2.sh
chmod +x test2.sh
./test2.sh

注意:运算符两边需要有空格,且使用的是反引号。算术运算符包括:+ - * / % = == !=

关系运算 只支持数字,不支持字符串,除非字符串的值是数字

  • -eq 是否相等
  • -ne 是否不等
  • -gt 大于
  • -lt 小于
  • -ge 大于等于
  • -le 小于等于
# test3.sh
a=12
b=13
if [ $a -eq $b ]
    then
    echo "相等"
else
    echo "不等"
fi

布尔运算

  • !
  • -o
  • -a

逻辑运算符

  • && 逻辑与
  • || 逻辑或

字符串运算符

  • = 相等 [ a = b ]
  • != 不等 [ a!=b ]
  • -z 字符串长度是否为0,为0返回 true [ -z $a ]
  • -n 字符串长度是否为0,不为0返回true [ -n $a ]
  • str 字符串是否为空,不为空返回true [ $a ]

文件操作符

  • -e 检测文件是否存在 [ -e $file ]
  • -d 检测文件是否为目录 [ -d $file ]
  • -f 检测文件是否为普通文件 [ -f $file ]
  • -r 检测文件是否可读 [ -r $file ]
  • -w 检测文件是否可写 [ -w $file ]
  • -x 检测文件是否可执行 [ -x $file ]
  • -s 检测文件大小是否大于0 [ -s $file ]

echo命令

echo在显示输出的时候可以省略双引号,使用read命令可以从标准输入中读取一行并赋值给变量

read name
echo your name is $name

换行使用转义符 \n,不换行使用 \c,此外使用 > 可将echo结果写入到指定文件,这个文件不存在则自动创建, 使用>> 可将echo打印的内容追加到指定文件末尾

echo使用反引号可以显示命令执行的结果,如:datehistorypwd

printf

shell中的输出命令 printf类似于C语言的printf(),语法格式: printf format-string [arguments...]

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 

test

test命令用于检查某个条件是否成立,可以进行数值、字符、文件三方面的测试

控制流程

# if
a=100
b=200
if [ $a -eq $b ]
then
    echo "相等"
else
    echo "不等"
fi

# for
for num in 1 2 3 4
do
    echo ${num}
done

num=10
for ((i=1;i<10;i++));
do
    ((num=num+10))
done
echo $num

#while
num2=1
while [ $sum -lt 100 ]
do
    ((num++))
done
echo $num2

#无限循环
while:
do
    command
done

while true
do
    command
done

for (( ; ; ))

#until
util condition
do 
    command
done

# case
echo "输入1 2 3任意一个数字"
read num
case $num in
    1)echo "输入了1"
;;
    2)echo "输入了2"
;;
    3)echo "输入了3"
;;
    *)echo "输入的值不是1 2 3"
;;
esac

函数

函数定义 用户自定义函数可以使用或者不使用关键字function,同事指定了return值则返回这个值,如果没有return语句则以最后一条运行结果作为返回值。调用函数直接使用这个函数名字即可。

# test4.sh
function first(){
    echo "hello word"
}
first

函数参数

function add(){
    num=0;
    for i in $@
    do
        num=`expr $i + $num`
    done
    return $num
}

add 1 2 {10} {100}
a=$?
echo $a

输入输出重定向

<>>><<>&<&

Shell文件包含

. ./filename 或者 source ./filename

本文链接:参与评论 »

--EOF--

专题「服务器相关开发」的其它文章 »

Comments