《Linux命令、编辑器与Shell编程》读书笔记11-Shell编程基础

调用shell

告诉系统该脚本该使用何种shell来执行,以#!开头,比如:

#!/bin/bash

表示该脚本是一个bash脚本;调用shell语句只能出现在第一行

注释

使用#注释它至行尾的所有内容,因此如果想在shell语句中使用#号,注意使用屏蔽符号。

执行shell脚本

使用对应的shell命令执行(比如bash script_name),或者.号,或者./。前两种执行方法会省略脚本第一行的shell调用命令,直接用用户当前使用的shell去执行。一般推荐使用./去执行shell脚本。

接收用户输入并赋值给变量

使用“read  变量名”的形式实现,使用$号提取变量中的值:

#!/bin/bash

echo -n "input strings you want todisplay:"

read DISPLAY

echo "$DISPLAY"

Bash中的变量

与其他编程语言不同,Bash中的变量没有数据类型之分;变量中的值都是以字符串的形式保存。如果要进行数值计算,需要进行特殊转换。Shell中的变量主要有以下四类:

Ø  环境变量

保存操作系统(OS)运行时使用的参数;可以通过set命令查看系统中的环境变量;不要随便修改环境变量。常用的环境变量有:

(1)HOME

/etc/passwd中的用户家目录字段定义,因此不同的用户、该变量对应的值是不同的。

*查看变量的值,可以用echo $HOME命令。

(2)LANG

系统语言,如果想要临时修改系统语言,可以直接给该变量赋值:

LANG=zh_CN.UTF-8

(3)SHELL

交互程序变量,决定了用户当前使用的Shell

(4)PATH

命令搜索路径变量,不用的目录用分号:分隔

(5)PS1

主提示符变量,也就是用户登录后显示的登录提示符,一般如下:

\[\]\h:\w # \[\]

其中的选项参数含义:

\h:当前计算机名

\u:当前使用系统的用户

\w:当前工作路径

\d:当前系统日期

\$:提示符,root#,普通用户是$

\H:完整的计算机名

\t24小时的时间格式

\v:当前Bash版本

修改时直接给该变量赋值即可,如:

PS1=’[\d \H \t \v]\$’

(6)PS2

辅助提示符变量,一般在强制换行时、输入这个变量对应的字符,将不执行命令继续等待下一行的输入,一般都是\

(7)只读环境变量

它们的值无法修改,使用readonly可以查看这些变量。在写脚本时,可以直接引用这些变量的值。

(8)永久修改环境变量

/etc/profile:全局用户配置文件,修改这个文件将影响所有用户。

~/.bash_profile:个人配置文件,只对对应的用户生效

/etc/bashrc:全局环境变量配置文件,定义了所有用户的环境变量

~/.bashrc:个人环境变量配置文件(如果是cshell,文件名为.cshrc

比如,想将某个用户的登录提示符永久修改,需要在对应的.bashrc中加入:

PS1='\h: '

export PS1

再登录时,提示符就会改变;这里的export表示将PS1转换为该用户的全局变量。

关于环境变量,下一篇笔记会有详细介绍。

Ø  位置变量

执行脚本时传递给脚本的参数

执行脚本时,可以在后面跟上参数传递到脚本中使用。这些变量会存在脚本的位置变量中,以$1~$9表示,($0表示脚本文件名),可以通过下面例子理解:

#脚本内容

#/bin/bash

echo $1

echo $2

#执行

./position_var.sh a  b

a

b

*这种方法只能给脚本传递最多9个参数。如果需要传递更多的参数,后面会有专门介绍。

 

Ø  预定义变量

系统保留和维护的一组特殊变量,通常用于保存程序的运行状态等参数;

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

$* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9;

$$ 脚本运行的当前进程ID;

$! 后台运行的最后一个进程的进程ID;

$@ $*相同,但是使用时加引号,并在引号中返回每个参数;

$- 显示shell使用的当前选项,与set命令功能相同;

$? 显示最后命令的退出状态.0表示没有错误,其他任何值表明有错误;

$0 保存当前进程或脚本的名称

 

Ø  自定义变量

用户自定义的变量。

Shell中的自定义变量没有数据类型,不用定义,直接赋值即可。自定义变量都是字符串类型,要想进行运算操作,需要用expr转换。比如:

A=1

B=2

expr $A + $B

*注:运算符前后要有空格!否则会当成是字符串拼接。也就是说上面的运算结果,和:

expr $A+$B

得出的结果是不一样的。

(1)自定义变量的作用域

除非使用export命令,否则只在所在脚本中生效。

(2)将自定义变量转换为只读变量

先定义自定义变量,然后执行:

readonly 变量名

*注:自定义变量转换为只读变量后,这个过程无法逆转。除非重启linux取消这个自定义变量。

(3)清除变量

变量使用完后应及时释放,使用命令:

unset 变量名

Shell数组

定义数组

方法一:直接对所有元素赋值

Array=(1 3 5 7 9)

方法二:单独赋值

Array[0]=1; Array[2]=5

这里由于没有对Array[1]赋值,系统会自动给Array[1]赋一个空值。

要修改数组中某个元素的值,方法和定义数组时一样。

引用数组

引用数组时,要把$放到大括号外边:

${Array[2]}

如果不加下标,直接引用数组名,则默认为引用数组的第一个元素的值:

${Array[0]}$Array意义相同

一次性引用数组中的所有元素:

echo  ${Array[*]}

引用下标大于2的元素:

echo ${Array[@]:2}

查看数组中元素的个数:

echo ${#Array[@]}

举例

1. 猜数字脚本

#!/bin/bash
#Generate a random number from 1 to 10
RAN=`expr $RANDOM % 10`
#Add 1 avoiding RAN equal to 0
RAN=`expr $RAN + 1`
echo "This is a guessing game"
echo "Please the number system generating, range 1-10"
while true
        do
        echo "Please enter a number you think:"
        read TMPNUM
        if [ $TMPNUM -lt 1 ] || [ 10 -lt $TMPNUM ]
                then
                echo "The number you entered is out of range."
                continue
        fi
        if [ $TMPNUM = $RAN ]
                then
                echo "You guess it!"
                unset TMPNUM RAN
                exit 0
        fi
        if [ $TMPNUM -lt $RAN ]
                then
                echo "The number you guessed is too small."
        else
                echo "The number you guessed is too large."
        fi
done

一定注意方括号前后的空格,否则运行脚本会报错。

2. 随机数排序

生成一组随机数赋值给一个数组,然后对数组中的元素进行使用冒泡排序并输出最终结果。

#!/bin/bash
#Define a Array with random values
Array=($RANDOM $RANDOM $RANDOM $RANDOM $RANDOM)
LENTH=${#Array[@]}
I=0
while [ "$I" -lt "$LENTH" ]
do
        J=`expr $I + 1`
        while [ "$J" -lt "$LENTH" ]
        do
                if [ "${Array[J]}" -lt "${Array[I]}" ]
                then
                TMP=${Array[J]}
                Array[J]=${Array[I]}
                Array[I]=${Array[J]}
                fi
                J=`expr $J + 1`
        done
        I=`expr $I + 1`
done
echo ${Array[@]}
unset Array I J TMP LENTH

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值