Linux shell学习

最近找了一些linux shell方面的资料学习,对学习总结如下

一、语法基础

1.变量

变量分为系统变量和用户变量
系统变量
如 [vigorski@localhost ~]$ set 会打印出系统所有的环境变量
[vigorski@localhost ~]$ pwd
/home/vigorski
 [vigorski@localhost ~]$ $HOME
bash: /home/vigorski: is a directory
用户变量
默认在shell中编写的变量全部是局部变量,如果重新打开console的话,那么这些变量将全部丢失,全局的变量可以写在文件~/.bashrc文件.
变量的定义:var=value变量的使用:${var}

* 单引号 '
由单引号括起来的字符都作为普通字符出现。特殊字符用单引号括起来以后,也会失去原有意义,而只作为普通字符解释。
* 双引号 "
由双引号括起来的字符,除$  `这几个字符仍是特殊字符并保留其特殊功能外,其余字符仍作为普通字符对待。
tip: 是转义字符, 它告诉shell不要对其后面的那个字符进行特殊处理,只当作普通字符即可

变量的真面目:
通常写的$a,其实际上是${a}的简写。完整的形式实际上还提供了更多的实用功能,如替换和模式匹配
替换:

${varname:-word}  :如果varname存在且非null,则返回varname的值,否则返回word
${varname:=word}  :如果varname存在且非null,则返回varname的值,否则将varname赋值为word,并返回
${varname:?message} :如果varname存在且非null,则返回varname的值,否则打印message并exit
${varname:+word} : 如果varname存在且非null,则返回word,否则返回null.

模式匹配:

${varname#pattern} : 从开头开始匹配最短的并删除,返回剩下的。
${varname##pattern} : 从开头开始匹配最长的并删除,返回剩下的。
${varname%pattern} : 从结尾开始匹配最短的并删除,返回剩下的。
${varname%%pattern} : 从结尾开始匹配最长的并删除,返回剩下的。
${varname/pattern/string}: 匹配最长的并替换为string,只替换第一个。
${varname//pattern/string}: 匹配最长的并替换为string,替换全部匹配。

特定变量

参数 含义
$# 传递到脚本的参数个数
$* 传递到脚本的参数, 即将所有参数作为一个字符串
$$ 脚本运行的当前进程号,常用作临时变量后缀
$@ 与$#相同,使用时加引号,并在引号中返回参数个数
$- 上一个命令的最后一个参数
$? 命令执行后返回的状态 一般为0(没有错误)
$! 后台运行的最后一个进程的进程ID

2.逻辑运算

数学运算:
a -eq b :a == b
a -ne b : a != b
a -lt b : a < b
a -le b : a <= b
a -gt b : a > b
a -ge b : a >= b

string比较:
string1 = string2
string1 != string2
string1 : string1 不是NULL,或者是没有定义

逻辑运算符:

! : not
exp1 -a exp2 : a && b
exp1 -o exp2 : exp1 || exp2

3.条件控制

if语句:
测试条件{用test 或[[ ]] (或[],在不引起歧义的情况下)引用起来}
整数比较: -eq -ne -gt -ge -lt -le
字符串比较:    = == != < > -z(字符串为空) -n(字符串非空)
文件测试: -e -f -s -d    -h -r -w -x
语句结构: 
   if/then[/else]/fi
   if/then/elif/then/fi

#!/bin/bash 
x=5 ; y=6
if [[ $x -eq $y ]]
then
echo "$x equals to $y"
else
echo "$x doesn't equals to $y"
fi

if test -e test.sh ; then
echo "File Exists"
fi

case结构:

#!/bin/bash 
var=2
case "$var" in
0) echo "This is 0" ;;    #其中0可以是形如 [0-9] 或是 [a-zA-Z] 及 用 | 等连接起来的表达式
1) echo "This is 1" ;;
2) echo "This is 2" ;;
*) echo "This is not 0, 1, 2" ;; # *表示默认匹配项,即上面都不匹配的时候。
esac
exit  

循环结构
while循环: while 测试条件 ; do ... ; done
for循环: for/in/do/done 通过指定变量范围进行循环。
--------------
#!/bin/bash
for var in 1 2 3 4 5    # or like this for ((var=1 ; var <=5 ; var++))
do
   echo -n "$var "
done
exit

示例:批量去掉指定文件夹下的文件后缀

ls ben/*.txt |while read file; do mv $file ${file%.*}; done

首先,将ben文件夹下的所有txt文件 通过管道重定向输入,然后在while循环中从管道中读出到file变量中,早do循环体中通过mv重命名文件。因为${varname%pattern} : 从结尾开始匹配最短的并删除,返回剩下的。所以会去掉文件后缀。

--------------

函数

function <name> () {
sequence of command
}
同C语言一样,在调用函数前应该申明它。
-----------
#!/bin/bash
function sum ()
{
if [ $# -ne 2 ] ; then
echo "Usage is sum <param1> <param2>"
exit
fi
return $(( $1 + $2 ))
}
sum 5 10
ret=$?
echo $ret
------------

二、其它命令

1.&& 与 ;
&&与;都支持执行多个command意思。其区别:
; 或类似c语言中的||
&& 与和C语言中的&&相同
比如要编译、安装 Linux ,您需要执行一串命令:'make dep'、'make clean'、'make bzImage'、'make modules'、'make modules_install'和'make install'。如果使用;,前面>一个操作失败后,但不影响后续的命令,最后会导致生成一个有问题的的文件

2.& 与|
&命令可以实现任务调度jobbing和后台backgrouding,比如你想在目前的终端中启动node.js服务,但启动完后你不想另外开一个终端,只想在当前的终端继续其他操作,这样你就可>以
sudo node mynode.js & ,将任务切换到后台,这样是不是不用切换terminal了。
停止服务:node
>
(^C again to quit)
>
[1]-  Stopped                 sudo node mynode.js

[2]+  Stopped                 node
关闭backgroud服务
| 命令识连接多个命令进行重定向,就是递进的表达式
比如 ls -l |less
首先列出目录内容,然后翻页显示
rpm -qa | grep ^x | less
首先列出已安装的rpm包,然后过滤(grep乃filter)只展示首字母为X的,最后分页显示

3.通配符
linux下的shell可以使用*、?、[]等通配符
*匹配任意字符,?匹配单个字符,[]匹配在某一范围的字符

4.more less
more命令功能:让画面在显示满一页时暂停,此时可按空格健继续显示下一个画面,或按Q键停止显示。
less命令功能:less命令的用法与more命令类似,也可以用来浏览超过一页的文件。所不同的是less命令除了可以按空格键向下显示文件外,>还可以利用上下键来卷动文件。当要结束浏览时,只要在less命令的提示符“:
”下按Q键即可。
5.< 与 >
<就是input输入的命令
>就是output输出的命令
比如上一个命令rpm -qa | grep ^x | less我们想把结果保存到文件中,可以使用
rpm -qa | grep ^x > rpmlist,将文件保存到rpmlist中。
比如
sort < dirlist > sdirlist
将文件'dirlist'的内容送到命令'sort',然后再将排序后的结果送到文件'sdirlist'。
另外一种变换
ls | sort > sdirlist
排序后输出
echo "vigorski" >> myfile
追加模式将字符串存入myfile,如果myfile不存在,将会创建。

但是我们有这样的需求,我们需要将一个文件排序后然后将排序好的数据追加到源文件中。
用 command < sortfile > sortfile会删除掉文件
而 command < sortfile >> sortfile 就可以完美解决

参考文献:

1.http://www.cnblogs.com/shipfi/articles/377367.html

2.http://www.cnblogs.com/hzl6255/archive/2013/02/23/2923850.html

3.http://www.cnblogs.com/xuqiang/archive/2011/04/27/2031034.html

4.http://www.cnblogs.com/simpman/archive/2013/06/09/3127993.html

5.http://www.cnblogs.com/louis-sherren/articles/linux-shell-init.html

原文地址:https://www.cnblogs.com/keily/p/3346205.html