Linux shell基础
Posted 米蓝
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux shell基础相关的知识,希望对你有一定的参考价值。
种类:cat /etc/shells 查看系统支持的shell
ash 占用资源最少的shell 只有24个内部命令。
bash linux默认使用的shell。可以使用doskey功能。可以自动补全.自带帮组文档。
ksh:功能很强大,支持很复杂的语法。可以直接写游戏。
csh:比较大的shell,符合c语言语法,基本覆盖c语言的功能。该shell指向/bin/tcsh 。也就是说 csh就是tcsh
zch:最大的shell之一。有84条内部命令。
set 查看所有的环境变量
用户的shell信息保存在/etc/passwd中。所以要为用户指定新的shell,最本质的做法就是对这个文件进行修改。
修改用户的shell:1、 usermod -s shellname username 如:usermod -s /bin/ksh xx1 2、 chsh -s shellname username
shell变量:跟windows的注册表差不多。安札变量的作用来分:环境变量(全局性的,无论谁登进去 都能看到)、本地变量(当前回话有效,退出会话,就会消失掉)。用set 命令查看。
当输入一个命令的时候,会到以下目录去搜索。
命令提示符的样式。\\u 当前登录的用户 \\h当前登录的主机 \\w 当前的目录所在
定义变量: abc=1234 或者 export abc=1234。当=两边有空格,必须用引号括起来。
$echo
$变量名 查看某一个环境变量 $echo $JAVA_HOME
PATH:PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
创建一个shell
vi test
#!/bin/bash 注释,哪个shell来执行。
cal 1 2017
date
w
存盘退出
执行 sh ./test
chmod a+x ./test 增加可执行属性
./test 执行
环境变量设置
/etc/profile 对所有的shell有效
/etc/bashrc 对bash shell有效
/用户目录/.bashrc
/用户目录/.bash_profile 对用户有效
实现 传参数 ./a1 $1 $2 $3……
vi a1
al 1 $1
cal 2 $1
cal 3 $1
shift命令:将 参数左移的效果。
文件b的内容为
echo $1 $2 $3
shift
echo $1 $2 $3
./b a b c
执行结果
a b c
b c
将 $2左移变成$1 $3变成$2
循环控制: for while
文件a3的内容为:
for i in 1 2 3
do cal $i $1
done
执行 ./a3 2014 结果为 显示2014年头三个月
文件 a5 内容
for i
do cal $i 2014
done
执行 sh a5 3 5 6 结果为 显示2014年 3、5、6月日历。i没有指定具体的循环机的话,就会从执行参数中获取。
For语句
for <循环变量> [in <循环变量取值集>] do <命令清单>
done
#!/bin/bash
for i
do cal $i 97
done
控制流while也是一种循环控制结构,用法是:
while <判别命令>
do <命令清单>
done
until控制流不while控制流用法类似,但作用相反。用法为:
until <判别命令>
do <命令清单>
done
if else 语句:
#!/bin/bash
if test –w /dev/lp #检车打印机准备好了没有
then echo Printer is ready... #显示Printer is ready
else echo Printer is not ready...
fi
case 语句:
case <变量> in
<字符串1> ) {<命令清单1>};;
...
<字符串n> ) {<命令清单n>};;
esac
例如:
#!/bin/bash
case $1 in
China ) echo Beijing
USA ) echo Washington
British ) echo London
Russia) echo Moskow
France ) echo Paris
* ) echo Out of my knowledge
esac
break和continue语句 跳出循环
break和continue的最大区别在于,break跳出整个循环,而contiune则跳过循环的当 前循环步。也就是说忽略了接下来的语句,直接跳到下一次循环。
here文本
在shell脚本中,还可以利用所谓的“here文本”功能,即可在脚本文件中嵌入一段文档,作为脚本中所使用的命令 的标准输入。具体用法为:
<命令> <<!
<作为输入的文本内容>
!
其中“!”符号也可用“EOF”、“END”等替代。例如,以下shell脚本tel可以迚行电话号码查询:
#!/bin/bash
a7的内容为:
#在<<!! 之间的文本中查找与输入相匹配的行。
grep $1 <<!
Huang W (020)81833222
Zhang QF (020)84185331
Liu T (010)65364321
MA QA (020)83304587
!
一般用在安装自动化里。比如安装mysql,会提示一些信息,必须输入yes或on。可以吧这些问题放到一个文档,进行自动化安装。
运行
sh a7 Zhang
返回结果
Zhang QF (020)84185331
在脚本中使用函数 直接使用函数名
#!/bin/bash
#function Time
Time()
{
#取出date +%R的返回值赋值给TM
TM=\'date +%R\'
echo "The system time now is ${TM}"
}
echo "now is going to the function Time"
#调用函数 Time
Time
echo "back from the funtion Time"
向函数传递参数 函数名 参数1 参数2
#!/bin/sh
#function func_test
func_test()
{
echo "$1" #注有双引号是传递给函数的参数,没有双引号是 调用shell文件时的参数
}
echo "start function"
func_test china #china作为参数传递给func_test
echo "end of function"
从函数中返回 return
#!/bin/sh
func_test()
{
if [ "$1" = "" ];
then
echo "none input"
return 0
else
echo "$1"
return 1
fi
}
func_test $1
获取函数返回值 用$?
#!/bin/sh
func_test()
{
if [ "$1" = "" ]; #"$1"调用函数传进来的参数。
then
echo "none input"
return 0
else
echo "$1"
return 1
fi
}
func_test $1 #$1是 执行shell文件传递进来的参数
if [ $? = 0 ]; #用$?捕捉函数执行的返回值。
then
echo "ple check you input" else
echo "all is ok" fi
条件测试:
test <表达式>
常见用法如下:
常用测试文件状态
-e <文件名称>:<文件名称>指定的文件存在。
-<文件性质> <文件名称>:此处的<文件性质>可以是:b(块设备)、c(字符设备)、d(目录)、f(普通文件)、L(符号链接)、p(管道文件)、r(可读文件)、w(可写文件)、s(非0字节文件)、x(可执行文件)。此表达式表示<文件名称>所指定的文件存在并且具有指定的性质。
<文件名称1> -nt <文件名称2>:表示<文件名称1>所代表的文件比<文件名称2>所代表的文件更新。
<文件名称1> -ot <文件名称2>:表示<文件名称1>所代表的文件比<文件名称2>所代表的文件更旧。
字符串测试
常用测试字符串测试的<表达式>有:
-z <“字符串”>:字符串为空串。
-n <”字符串”>:字符串是非空串。
<字符串1> = <字符串2>:字符串1与字符串2相等。
<字符串1> != <字符串2>:字符串1与字符串2不相等。
! <表达式>:<表达式>不成立。
<表达式1> -a <表达式2>:<表达式1>与<表达式2>同时成立。
<表达式1> -o <表达式2>:<表达式1>或<表达式2>成立。
数值测试
常用于数值测试的<表达式>有:
<数值表达式1> <算符> <数值表达式2>,此处,<算符>可以是:
-eq:两者相等。
-he:两者不等。
-lt:前者小于后者。
-le:前者小于或等于后者。
-gt:前者大于后者。
-ge:前者大于或等于后者。
<数值表达式>可以是整数或用“-l <字符串>”来表示求字符串的长度。
expr用法
expr命令一般用于整数值,但也可用于字符串。一般格式为:
expr argument operator argument
expr也是一个手工命令行计算器,如图所示。
增加计数:
常常用于循环中,用法如下:
loop=0
loop=’expr $loop +1’
数值测试:
这里的数值测试并不是上面所讲到的数值测试,这里的数值测试是检查被测变量是否为整数。如下面:
前面我们已经定义了变量number,现在在提示符下输入如下:
expr $number + 100 > /dev/null 2>&1
echo $?
系统返回 “0” 表示number变量为整数,自己动手用一个非整数的变量测试,观察系统返回的数值是否非0
模式匹配:
expr也有模式匹配功能。可以使用expr match STRING REGEXP计算字符串中字符数。“. *”意即任何字符重复0次或多次,如下:
docu=blue.doc
expr match $docu ".*"
8 (系统返回)
在expr中可以使用字符串匹配操作,这里使用模式.doc抽取文件名。如下面的命令:
expr match $value "\\(.*\\).doc"
blue (系统返回)
命令如下:
test -e test
echo $?
返回0表示存在。1表示不存在。 在脚本里 不需要echo命令。
a6内容如下:
#/bin/bash
if [ $1 -eq 1 ];then
echo "\\$1 is 1"
else echo "\\$1 is not 1"
fi
执行 sh a6 1 结果为 $1 is 1。sh a6 sdfkj 结果为 $1 is not 1。 中括号就相当于test
练习:
1 判定一个用参数指定的文件是否为可执行,如果不是,则改为可执行
if !(test -x a)
then
echo 执行chmod
chmod a+x a
else
echo 已有可写权限
fi
ls -l a
2 用while和until循环,实现输出某年前9个月月历的效果
i=1
while [ ${i} -le 9 ];
do
cal ${i} $1
let i=i+1
done
i=1
until [ ${i} -gt 9 ];
do
cal ${i} $1
let i=i+1
done
3 使用here文档写一个脚本,来实现删除某个指定文件时不用回答yes or no而直接删除,限定不能使用rm的-f开关
#!/bin/bash
rm -i $1 <<!
y
!
4、写一个脚本,可以输出用参数指定的年,以及该年中某几个用参数指定的月的月历,月的个数是不固定的
i=1
while [ ${i} -le $2 ];
do
cal ${i} $1
let i=i+1
done
以上是关于Linux shell基础的主要内容,如果未能解决你的问题,请参考以下文章