shell 基本操作小结金沙官网线上

1.echoif else fi命令

#!/bin/bash
echo hello;echo there
filename=demo.sh
if [ -e "$filename" ]; then 
    echo "$filename already exists!";cp $filename $filename.bak
else
    echo "$filename does not exist!";
fi;
echo "File test complete!"

运行结果(demo.sh不存在):

hello
there
demo.sh does not exist!
File test complete!

需要注意的是filename=demo.sh等号两边是不能有空格的;if [ -e "$filename" ]中[]左右两侧都是有空格的。

   从事机顶盒开发以来,看到很多的Shell脚本,比如:开机启动脚本、系统升级脚本、软探针脚本、和系统编译脚本。这些脚本都是用shell语言开发,虽然在平时的需求开发和维护中会涉及到一定的脚本修改,但是一直没有系统的学习过shell语言。

2.shell基本操作

所以本篇文章主要是记录学习shell过程中的笔记。同时也为巩固markdown语法,本篇笔记都是用markdown记录。

2.1 变量大于,等于,小于

#!/bin/bash
a=1
if [ $a -gt 0 ]; then
    echo "greater than zero!"
else
    echo "no more than zero!"
fi
if [[ $a -lt 0 ]]; then
    echo "less than zero!"
else
    echo "no less than zero!"
fi
if [[ a -eq 1 ]]; then
    echo "equal to 1!"
else
    echo "not equal to 1!"
fi

-gt表示大于;-lt表示小于;-eq表示等于。运行结果为:

greater than zero!
no less than zero!
equal to 1!

shell脚本语言

2.2 三目运算符(?:)

# ? is 3 operator
b=10
((t=b<20?6:4)) # t = 6
echo "t=$t"
# variable in () is a part region variable
(b=20;echo "b = $b") # b = 20
echo "b = $b" # b = 10

和C,java等语言类似,shell中的?:也是三目运算符。()表示一个建立局部作用域,可以暂时屏蔽全局变量。上式的运行结果为:

t=6
b = 20
b = 10

1、什么是shell脚本语言?

脚本语言是像剧本一样教计算机办某个事情的语言。

脚本语言其实就是短小的、用来让计算机自动化完成一系列工作的程序,这类程序可以用文本编辑器修改

不需要编译,通常解释运行。

2.3 数组

2、运行shell脚本的两个方法

chmod +x ./XXX.sh    chmod后有空格
./XXX.sh

/bin/sh XXX.sh
2.3.1 数组创建
# () create an array
arr=(1 2 3 5 6)
echo "arr[3] = ${arr[3]}"

输出:

arr[3] = 5

3、shell变量

定义变量时,变量名不加$,如:

your_name="runoob.com"

使用定义过的变量时,只要在变量名前面加上$符号即可,如:

your_name="qinjx"
echo ${your_name}
2.3.2 数组长度
# get the length of array
echo "length of arr is ${#arr[*]}" # 5
echo "length of arr is ${#arr[@]}" # 5

输出:

length of arr is 5
length of arr is 5

只读变量

readonly myUrl
myUrl="www.baidu.com"
2.3.3 输出数组元素
# get all content of array
echo "arr:${arr[*]}" # 1 2 3 5 6
# or
echo "arr:${arr[@]}" # 1 2 3 5 6

输出:

arr:1 2 3 5 6
arr:1 2 3 5 6

删除变量

unset myUrl
2.3.4 修改数组元素
# assign a new element to an array
arr[1]=100
echo "arr:${arr[@]}" # 1 100 3 5 6
# if assign index if out of bound,then auto create a new element of array
arr[10]=20 # 1 100 3 5 6 20
echo "arr:${arr[@]}"

输出:

arr:1 100 3 5 6
arr:1 100 3 5 6 20

注意如果赋值索引超出数组长度,相当于是给数组末尾增加一个新元素。

变量类型

1、局部变量 :局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动程序不能访问变量

2、环境变量 :所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量

3、shell变量 :shell变量是由shell程序设置的特殊变量,shell变量中有一部风是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

2.3.5 删除数组元素
# delete the element of array
unset arr[1] # delete the arr[1],1 3 5 6 20
echo "arr:${arr[*]}" # 1 3 5 6 20
# clear the whole array
unset arr 
echo "${#arr[@]}" # length 0

输出:

arr:1 3 5 6 20
0

unset 如果跟上数组的索引,是删除该位置的数组元素;如果直接跟数组名,相当于是清空数组。

4、shell字符串

字符串可以使用单引号也可以使用双引号,也可以不使用引号

强烈建议使用双引号

2.3.6 数组切片
arr=(1 2 4 10)
# slice of array
# ${array_name[*]:start:length},return is a string
echo "${arr[@]:0:3}" # 1 2 4
# assignment
arr1=(${arr[*]:1:2}) # arr1:2 4
echo "${#arr1[@]}"
echo "arr1:${arr1[@]}"

输出:

1 2 4
2
arr1:2 4

获取字符串长度

string="adcg"
echo ${#string}

多了个#

2.3.7 数组元素替换
# replace
# ${array_name[@]/origin_element/new_element}
# this operation doesn't change the origin array
# and will return a string that seperated by space
echo "${arr1[*]/2/20}" # 20 4,arr1:2 4
arr1=(${arr1[*]/4/40}) # arr1:2 40
echo "${arr1[*]}" # 2 40

输出:

20 4
2 40

提取字符串

string="runoob is a great site"
scho ${string 1:4} 输出uoo ,从0开始算

2.4 文件操作

# file operation
if [ ! -w 't.txt' ]; then
    touch t.txt
fi
echo 'test text' > t.txt 
cp t.{txt,back} # cp t.txt to t.back
filename="/home/lyrichu/login"
if [ -r $filename ] # if file is readable
    then 
    echo "$filename is readable!"
else
    echo "$filename is not readable!"
fi

if [ -e $filename ]
    then
    echo "$filename exists!"
else
    echo "$filename doesn't exist!"
fi 

输出:

/home/lyrichu/login is not readable!
/home/lyrichu/login doesn't exist!

上面的代码首先检查t.txt文件是否可写,如果不可写,则重新创建一个文件;然后向t.txt文件写入字符串'test text';接着复制t.txt文件到t.back文件;
然后判断/home/lyrichu/login文件是否可读以及是否存在。

5、shell数组

shell只支持一维数组

2.5 {}创建一个代码块

# {} create a code block
a=10;echo "a=$a"
{ a=20; } # a = 20
echo "a=$a" # a = 20

输出:

a=10
a=20

定义数组

用括号来表示数组,数组元素用“空格”符号分割开来,定义数组的一般形式为:

array_name=(value0 value1 value2 value3)

2.6 expr 计算表达式的值

val=`expr $a + $b` # a = 20,b = 10
echo "a + b = $val" # a + b = 30

val=`expr $a * $b` # * means multiply,a*b = 10*20 = 200
echo "a*b=$val"

# divide
val=`expr $a / $b` # 20/10 = 2
echo "a / b = $val"

# mod
val=`expr $a % 9` # 20 % 9 = 2
echo "$a % 9 = $val" # 20 % 9 = 2

输出:

a + b = 30
a*b=200
a / b = 2
20 % 9 = 2

expr可以计算shell表达式的值,上式分别计算了+,*,/,%运算,注意乘法需要使用*转义。

读取数组

valuen=${array_name[1]}

使用@符号可以获取数组中的所有元素,例如:

echo ${array_name[@]}

取得数组元素的个数

length=${#array_name[@]

取得数组单个元素的长度

length=${#array_name[1]}

2.7 逻辑运算符

if [ $a == $b ]
then echo "a == b!"
fi
if [ $a != $b ] 
    then 
    echo "a != b" 
fi 

# && logit and
if [[ $a -gt 10 && $b -lt 20 ]]
    then
    echo "$a > 10 and $b < 20!"
else
    echo "bad condition!"
fi
# || logit or 
if [[ $a -gt 15 || $b -gt 15 ]]
    then
    echo "a > 15 or b > 15"
else
    echo "a<=15 and b<=15"
fi 

输出:

a != b
20 > 10 and 10 < 20!
a > 15 or b > 15

== 用于比较数字相等;!=用于比较数字不等。&&表示shell中的逻辑与;||表示shell中的逻辑或运算。

6、shell传递参数

脚本内获取参数的格式为:$n,n代表一个数字,$0代表文件名,、$1代表参数1,$2代表参数2。

输出不存在的参数时结果为空

  • $# 传递到脚本的参数个数

  • $* 以一个单字符串显示所有脚本传递的参数

  • $$ 脚本运行的当前进程号

本文由金沙官网线上发布于操作系统,转载请注明出处:shell 基本操作小结金沙官网线上

您可能还会对下面的文章感兴趣: