程序员

shell 脚本基础笔记

2017-01-01  本文已影响205人  黑泥卡

这个trello用来存放我有关Linux的资料。
菜鸟教程学习的一点记录:

准备

这里的 shel l脚本指的 bash 脚本。

如果你新建的是 test.sh,如果想运行这个 sh。你需要执行 ./test.sh而不是 test.sh。
运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去PATH里寻找有没有叫test.sh的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找

Shebang 用来指定,使用那个终端。

#!/bin/bash

接下来就可以编写你的bash脚本了。

编写你的shell

惯例HelloWorld

#!bin/bash
echo "Hello World"

ps:echo 用于字符串的输出。接下来会讲到

变量的定义

主要就是定义字符串,数字,数组。
详细定义规则

your_name="qinjx"
echo $your_name
echo ${your_name}

传递参数

#!/bin/bash
# 传递参数实例

echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

# 用于处里字符的参数
#
# 参数处理   说明
# $#        传递到脚本的参数个数
# $*        以一个单字符串显示所有向脚本传递的参数。
#           如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
# $$        脚本运行的当前进程ID号
# $!        后台运行的最后一个进程的ID号
# $@        与$*相同,但是使用时加引号,并在引号中返回每个参数。
#           如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
# $-        显示Shell使用的当前选项,与set命令功能相同。
# $?        显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
#
#
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
# my_array[0]=A
# my_array[1]=B
# my_array[2]=C
# my_array[3]=D
my_array=(A B "C" D)

echo "第一个元素为: ${my_array[0]}"
echo "第二个元素为: ${my_array[1]}"
echo "第三个元素为: ${my_array[2]}"
echo "第四个元素为: ${my_array[3]}"

# get all item
echo "数组的元素为: ${my_array[*]}"
echo "数组的元素为: ${my_array[@]}"

# get array length
echo "数组元素的长度为: ${#my_array[*]}"
echo "数组元素的长度为: ${#my_array[@]}"

执行结果:


数组

printf

#!/bin/bash
# printf 命令模仿 C 程序库(library)里的 printf() 程序。
# 标准所定义,因此使用printf的脚本比使用echo移植性好。
# printf 使用引用文本或空格分隔的参数,外面可以在printf中使用格式化字符串,还可以制定字符串的宽度、
# 左右对齐方式等。默认printf不会像 echo 自动添加换行符,我们可以手动添加 \n。
# %s %c %d %f都是格式替代符
# %-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
# %-4.2f 指格式化为小数,其中.2指保留2位小数。

printf "%-10s % -8s %-4s\n" 姓名 性别 体重kg
printf "%-10s % -8s %-4.2f\n" 郭靖 男 66.7865

# format-string为双引号
printf "%d %s\n" 1 "abc"

# 单引号与双引号效果一样
printf '%d %s\n' 1 "abc"

# 没有引号也可以输出
printf %s abcdef

# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
printf %s abc def

printf "%s\n" abc def

printf "%s %s %s\n" a b c d e f g h i j

# 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
printf "%s and %d \n"

test

#!/bin/bash

#数值测试
# -eq   等于则为真
# -ne   不等于则为真
# -gt   大于则为真
# -ge   大于等于则为真
# -lt   小于则为真
# -le   小于等于则为真
num1=100
num2=200
if test $[num1] -eq $[num2]
then
  echo '两个数相等1'
else
  echo '两个数不相等'
fi

#字符串测试
# =         等于则为真
# !=        不相等则为真
# -z 字符串    字符串的长度为零则为真
# -n 字符串    字符串的长度不为零则为真
str1="kaka08"
str2="kaka22"
if test $str1 = $str2
then
  echo "两个字符串相等"
else
  echo "两个字符串不相等"
fi

#文件测试
# -e 文件名    如果文件存在则为真
# -r 文件名    如果文件存在且可读则为真
# -w 文件名    如果文件存在且可写则为真
# -x 文件名    如果文件存在且可执行则为真
# -s 文件名    如果文件存在且至少有一个字符则为真
# -d 文件名    如果文件存在且为目录则为真
# -f 文件名    如果文件存在且为普通文件则为真
# -c 文件名    如果文件存在且为字符型特殊文件则为真
# -b 文件名    如果文件存在且为块特殊文件则为真
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

# if condition
# then
#     command1
#     command2
#     ...
#     commandN
# fi

# 写成一行(适用于终端命令提示符):
# if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

# if condition1
# then
#     command1
# elif condition2
# then
#     command2
# else
#     commandN
# fi
a=10
b=20
if [ $a == $b ]
then
   echo "a 等于 b"
elif [ $a -gt $b ]
then
   echo "a 大于 b"
elif [ $a -lt $b ]
then
   echo "a 小于 b"
else
   echo "没有符合的条件"
fi

# for 循环
# 与其他编程语言类似,Shell支持for循环。
# for循环一般格式为:
# for var in item1 item2 ... itemN
# do
#     command1
#     command2
#     ...
#     commandN
# done
for loop in 1 2 3 4 5 6
do
  echo "The vlue is: $loop"
done

# while 语句
# while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:
# while condition
# do
#     command
# done
int=1
while(($int<=5))
do
  echo $int
  let "int++"
done

# 使用中使用了 Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量,具体可查阅:Bash let 命令
# 。
# while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按<Ctrl-D>结束循环。
# echo '按下 <CTRL-D> 退出'
# echo -n '输入你最喜欢的电影名: '
# while read FILM
# do
#     echo "是的!$FILM 是一部好电影"
# done

# Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:
# case 值 in
# 模式1)
#     command1
#     command2
#     ...
#     commandN
#     ;;
# 模式2)
#     command1
#     command2
#     ...
#     commandN
#     ;;
# esac
# case工作方式如上所示。取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。
# 取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
# 下面的脚本提示输入1到4,与每一种模式进行匹配:
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

function

#!/bin/bash

#sample
demoFun(){
  echo "这是一个函数"
}
echo "---------函数开始运行----------"
demoFun
echo "---------函数运行完毕----------"

#return
funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
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 34 73
# 注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。

输入/输出重定向

地址:http://www.runoob.com/linux/linux-shell-process-control.html

文件包含

格式:

. filename   # 注意点号(.)和文件名中间有一空格

或

source filename

实例:

test1.sh

#!/bin/bash

url="http://www.runoob.com"

test2.sh

#!/bin/bash
#使用 . 号来引用test1.sh 文件
. ./test1.sh

# 或者使用以下包含文件代码
# source ./test1.sh

echo "菜鸟教程官网地址:$url"
上一篇下一篇

猜你喜欢

热点阅读