欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux系统之shell编程基础

程序员文章站 2022-03-04 18:59:10
...

由于在之前校招面试中,被问到了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 value
echo "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 v1
read v2
add=`expr $v1 + $v2`
echo add

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

read s1
read 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 a
read b
if test $a -lt $b
 then
	echo "$a小于$b"
else
	echo "$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 dir
if [ -d $dir ]
	ls $dir
elif [ -f $dir ]
	cat $dir
else
	echo "该字符串既不是文件也不是目录"
fi

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

esac

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

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

filst = `ls`
for file in $filst
do
if[ $# = 0 ]
then 
	cp $file $HOME/backup
	echo "$file copied"
fi
done
echo "copying complicated" 

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

if [ $# = 2 ]
then 
	loop=$2
else
	loop=6
fi
cout=0
while [ cout -lt loop ]
do
	>$1$cout
	cout=`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]
		then 
			return 0
		else
			return 1
		fi
}
while true
do
	echo "input username:\c"
	read uname
	uname=check_user()
	if [ $? -eq 1]
	then 
		echo "找到已登录的指定用户"
	else
		echo "未找到已登录的指定用户"
	fi
done
相关标签: shell