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 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
上一篇: 你对PHP JSON函数有多少了解呢?
下一篇: 预览图片
推荐阅读