Linux Shell 使用笔记

Linux Shell是一种基本功,由于怪异的语法加之较差的可读性,通常被Python等脚本代替。既然是基本功,那就需要掌握,毕竟学习Shell脚本的过程中,还是能了解到很多Linux系统的内容。Linux脚本大师不是人人都可以达到的,但是用一些简单的Shell实现一些常见的基本功能还是很有必要的。

2.正题

1) 热身

下面的例子展示了如何向脚本传递参数、脚本如何获取参数、if-else判断、变量的使用等基本内容。


#!/bin/bash

if [[ $# -lt 1 ]]; then
        echo "args count must > 1"
        echo "Uage: bash +x example01.sh [args...]"
        exit
fi

arg=$1

if [[ $arg -gt 10 ]]; then
        echo "$arg > 10"
else
        echo "$arg < 10"
fi
这个脚本的调用方式如下:


bash +x example01.sh 52).数组、函数传参数,循环

下面的例子展示了数组、函数、循环等基本使用。


#!/bin/bash

if [[ $# -lt 1 ]]; then
 echo "args count must > 1"
 echo "Uage: bash +x example01.sh [args...]"
 exit
fi

args=$@

for arg in $args; do
 echo $arg
done

function fun() {
 echo $1
}

fun "hello shell"

fun2() {
 echo "Linux"
}

fun2注意,函数fun中的$1,获取的是函数参数,不是脚本调用时传入的参数。$@ 是获取脚本调用时传入的参数列表。

3).while 循环以及其他几种循环、case、表达式expr的使用


#!/bin/bash

if [[ $# -lt 1 ]]; then
        echo "args count must > 1"
        echo "Uage: bash +x example01.sh [args...]"
        exit
fi

case $1 in
        "install" )
                echo "operation type is install"
        ;;
        "uninstall" )
                echo "operation type is uninstall"
        ;;
        * )
                echo "operation type is not support"
        ;;
esac

for ((i=0;i<3;i++))
do
        if ((i==1))
        then
                continue
        fi
        echo $i
done

for i in `seq 5`
do
        echo "loop $i"
done


注意这里的case * 并不是所有,而是输入值不在case中,相当于default. 在循环中可以使用continue/break等关键字,非常类似Java等其他语言的循环。

4).脚本之间互相引用

通过source 或者 . 的方式可以引用另一个脚本中的函数或者变量

first.sh


function fun(){
 echo "i am from first."
}

file=firstsecond.sh


. first.sh
fun

echo $file
使用bash +x second.sh执行,在second.sh 中可以调用fun函数和使用file变量。

这里的.和source都可以实现引用first文件中的变量。注意: 如果同时引用了多个脚本的同一个变量名的变量,后面的值会覆盖前面的变量而不会报错。
5).关于错误处理

a)在shell中有一个变量 $? ,这个变量记录的是上次脚本执行的结果,如果正常结束则是0,否则是非0值;

b)如果在shell脚本中通过set -o errexit来实现遇到错误就退出,这样能够避免产生更多的错误;

c)在shell执行过程中如果出错,可以通过重定向的方式,输出到文件中,比如Command >> filename2>&1

6).字典

shell中的字典是非常好的数据结构,能够很方便地处理配置


#!/bin/bash

set -o errexit

hput(){
 eval "hkey_$1"="$2"
}

hget(){
 eval echo '${'"hkey_$1"'}'
}

hput k1 v1
hget k1

declare -A dic

dic=([key1]="value1" [key2]="value2" [key3]="value3")

echo ${dic["key1"]}
# output all key
echo ${!dic[*]}
#outpull all value
echo ${dic[*]}
# access all
for key in $(echo ${!dic[*]})
do
        echo "$key : ${dic[$key]}"
done
执行之后,输出如下:


v1
value1
key3 key2 key1
value3 value2 value1
key3 : value3
key2 : value2
key1 : value1
7).文本处理

sed 命令能够对对文本进行操作。

比如有一个文件sedfile,内容如下:


1
2
3
4
5执行 "sed '1,3d' sedfile,则会输出4,5 两行,即对1,2,3行做了删除处理,注意这时文件里面并没有删掉这两行。

除了删除之外,还可以做替换操作。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/14898.html