AI智能
改变未来

Linux系统之shell编程基础

由于在之前校招面试中,被问到了shell相关问题,很久未使用到,忘了大部分,故此重新学习一下shell。

1.简单地认识shell

shell是命令解释器,是介于用户与Linux内核之间的绝缘层,相当于用户与Linux内核之间的翻译官。

2.shell的基本语法

(1) 开头
shell程序的第一行一定是#!/ bin/bash,符号#!是告诉系统后面的参数是用来执行的程序,如用bin目录下的bash执行程序。
编辑完程序文件后,不能马上进行执行文件,必须先为文件给权限,如chomod +x a.sh
(2)执行
shell执行方式有三种,第一种: ./a.sh 第二种: bash a.sh 第三种在任何目录下都能够执行目标文件:
export PATH=/home/Linux/Shell:$PATH
./a.sh

3.变量

(1)用户自定义变量
不支持数据类型(整形,字符,浮点,布尔值),赋给变量的值都是被shell解释为字符串,变量命名规则同C语言。取用一个变量的值用$符号,unset用来删除变量的赋值。如:

value=\"hello word\"echo \"value\"unset valueecho \"value\"

(2)位置参数
由系统提供的参数称为位置参数,如命令行中给出的参数。一般参数由$N表示,N为阿拉伯数字,如有以下命令行:./a.sh a b c d 那么程序中$0表示./a.sh,$1表示a,以此类推
(3)预定义变量
预定义变量是shell已经定义好了的变量,不能重新定义。常用变量如:
$#:命令行参数的个数
$?:程序中,上一条命令的执行情况,若正常执行,则返回1,否则返回0
$*:列出所有命令行参数
$$:当前进程ID号

(4)环境变量
环境变量用于所有的用户进程。在Linux中,登陆进程称为父进程,正在执行的用户进程为子进程。环境变量可以在命令行设置,但是该Linux用户注销时,这些值将丢失,因此最好将环境变量定义在$HOME/下的.profile,环境变量应用于用户进程时,应用export命令导出。
常见的环境变量如下:
HOME:/etc/passwd文件中列出的用户主目录
PATH:shell搜索路径
HISTSIZE:保存历史命令记录的条数
LOGNAME:当前用户登录名
HOSTNAME:主机名称
SHELL:当前用户用的是哪种shell。

4.功能性语句

(1)键盘读入变量值
read 变量
(2)算数运算符
加减乘除 用运算符时,应添加expr以及“反引号,代码如下:

read v1read v2add=`expr $v1 + $v2`echo add

(3)test命令
test可以测试三种对象:整数,字符串,文件属性
测试字符串:
s1 = s2 测试两个字符串是否一样
s1 != s2 测试两个字符串是否不同
-z s1 测试字符串长度是否为0
-n s1 测试字符串长度是否非0
一般字符串测试需要加上[ ] ,如:

read s1read s2[ \"$s1\"=\"$s2\" ]echo $?

测试整数:
a -eq b 测试a与b是否相等
a -ne b 测试a与b是否不等
a -gt b 测试a是否大于b
a -ge b 测试a是否大于等于b
a -lt b 测试a是否小于b
a -le b 测试a是否小于等于b
一般测试数字应该在前加上test, 代码如下

read aread bif test $a -lt $bthenecho \"$a小于$b\"elseecho \"$x不小于$b\"fi

文件测试:
-d name 测试name是否一个目录
-f name 测试name是否是一个文件
-L name 测试name是否是一个符号链接
-r name 测试name是否存在且可读
-w name 测试name是否存在且可写

文件测试如字符串测试,需要在条件外加上[ ], 如[ -d /home/Linux/Shell ]

5.结构性语句

(1)条件测试语句
if 条件
then
命令
fi

if 条件
then
命令
else
命令
fi

if 条件
then
命令
elif
命令
else
命令
fi
示例代码如下

read dirif [ -d $dir ]ls $direlif [ -f $dir ]cat $direlseecho \"该字符串既不是文件也不是目录\"fi

(2)多路分支语句
case 字符串变量 in
模式1)
命令表
模式2)
命令表

esac

case $1 infile1)echo \"file1\";break;file2)echo \"file2\";break;*)echo \"既不是file1也不是file2\";break;esac

(3)循环语句—for
for 变量名 in 单词表
do
命令表
done
示例代码如下:

filst = `ls`for file in $filstdoif[ $# = 0 ]thencp $file $HOME/backupecho \"$file copied\"fidoneecho \"copying complicated\"

(4) 循环语句—while
while 命令
do
命令
done
示例代码如下:

if [ $# = 2 ]thenloop=$2elseloop=6ficout=0while [ cout -lt loop ]do>$1$coutcout=`expr $cout + 1`done

6.Shell函数

函数只在当前shell中起作用,不能输出到子shell中
函数定义格式:
function_name()
{
}
或者
function function_name()
{
}
函数调用:
v=

function_name[参数1 参数2...]

或者
function_name [参数1 参数2…]
echo $?
第一种调用为有函数返回值,第二种为无函数返回值
函数示例代码:

check_user()#查找已登录的指定用户{user=` who | grep $1 | wc -l`if [ $user -eq 0]thenreturn 0elsereturn 1fi}while truedoecho \"input username:\\c\"read unameuname=check_user()if [ $? -eq 1]thenecho \"找到已登录的指定用户\"elseecho \"未找到已登录的指定用户\"fidone
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Linux系统之shell编程基础