一. Linux基本命令
1.1.
该命令的功能是将给出的文件或目录拷贝到另一文件或目录中,功能十分强大。
语法: cp [选项] 源文件或目录 目标文件或目录
1.2. mv命令
用户可以使用mv命令来为文件或目录改名或将文件由一个目录移入另一个目录中。
语法:mv [选项] 源文件或目录 目标文件或目录
1.3. rm命令
用户可以用rm命令删除不需要的文件或者目录。
语法:rm [选项] 文件
如果没有使用- r选项,则rm不会删除目录。
1.4. mkdir和rmdir
语法:mkdir [选项] dir-name
语法:rmdir [选项] dir-name
1.5. cd 命令
功能:改变工作目录。
语法:cd [directory]
1.6. ls 命令
ls是英文单词list的简写,其功能为列出目录的内容。该命令类似于DOS下的dir命令。
语法:ls [选项] [目录或是文件]
1.7. su命令
这个命令非常重要。它可以让一个普通用户拥有超级用户或其他用户的权限,也可以让超级用户以普通用户的身份做一些事情。普通用户使用这个命令时必须有超级用户或其他用户的口令。
该命令的一般形式为: su [选项] [使用者帐号]
1.8. ps命令
显示系统中执行的程序。
语法:ps [选项]
1.9. kill命令
删除执行中的程序
语法:kill [选项] PID
1.10. grep命令
搜寻输出的特定文字
语法:grep 字符串
例:
ps aux | grep matlab
kill PID
1.11. echo命令
echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用。
该命令的一般格式为: echo [ -n ] 字符串
1.12. clear命令
clear命令的功能是清除屏幕上的信息,它类似于DOS中的 cls命令。清屏后,提示符移动到屏幕左上角。
二. Shell的基本知识
2.1. shell提示符及其环境
提示符:$
环境:Linux,Unix,Dos等等
Shell其实就是一个解释执行命令的程序,所谓shell编程其实就是用一定的语法将各种基本的命令组合起来,让shell程序去解释执行。
同传统的编程语言一样,shell提供了很多特性,这些特性可以使你的shell script编程更为有用,如:数据变量、参数传递、判断、流程控制、数据输入和输出,子程序及以中断处理等。
2.2 如何执行shell程序
Shell程序(***.sh)
执行这个命令时
(1) #./***.sh
(2) #chmod u+x ***.sh
#***.sh
(3) #sh ***.sh
2.3 常量
字符串,例如“Hello World!”。
数字,例如705,23。
2.4 变量
shell编程中它们是没有类型的,简称弱类型编程语言,在这个变量中可以保含一个数字,一个字符串,一个单词等。你并不需要声明这个变量,它会在引用这个变量时创建它。
STR="Hello World!"
echo $STR
HOME="/home"
a=123
HOME_LIST=$(ls /home) //把命令的执行结果赋值给变量
ehco $HOME
a=a+1
系统变量:
$0 这个程序的执行名字
$n 这个程序的第n个参数值,n=1...9
$* 这个程序的所有参数
$# 这个程序的参数个数
$$ 这个程序的PID
$! 执行上一个背景指令的PID
$? 上一个指令的返回值
2.5 局部变量
局部变量一般是指写在函数中的变量,他的生命力是有限的。局部变量比较好理解,这里就不再多介绍了。
2.6 从键盘输入变量值
使用read命令
read var1 var2 … varn
2.7 注释
Shell编程中的注释以#开头
2.8 数字运算
主要是指整数运算。expr命令可以将字符型变量转换为整数进行操作
语法:expr integer operator integer
其中operator为+ - * / %, 但对*的使用要用转义符/,如:
[oracle@localhost ~]$ more dvd.sh
#!/bin/bash
expr 5 /* 5
[oracle@localhost ~]$ sh dvd.sh
25
2.9 逻辑运算
test进行逻辑运算,用[ ]括起来就是test运算
int1 -eq int2 相等?
int1 -ne int2 不等?
int1 -gt int2 int1 > int2 ?
int1 -ge int2 int1 >= int2 ?
int1 -lt int2 int1 < int2 ?
int1 -le int2 int1 <= int2
2.10 双引号及单引号
$echo "$HOME $PATH"
/home/hbwork opt/kde/bin:/usr/local/bin:
$HOME $PATH
2.11 空格
由于shell对命令中的多余的空格不作任何处理 ,而用引号括起来则可以防止shell去掉这些空格。
$ str1=abcd
$ str2="abcd "
2.12
2.12.1 结构一
if [ variable = value ]
then
command
else
if [ variable = value ]
then
command
else
command
fi
2.12.2 结构二
if [ variable = value ]
then
command
elif [ variable = value ]
then
command
fi
if 语句示例:
if [ "22" -lt "33" ]
echo "22 less than 33"
else
echo "no"
fi
2.13 Case语句
case value in
pattern1)
command;;
pattern2)
command;;
...
patternn)
command;
esac
case 示例:
echo "enter a number"
read ans
case $ans in
1)
echo
;;
2)
echo "you number is 2"
;;
[3-9])
echo "you number is $ans"
;;
*)
echo "others"
esac
2.14 And 和 Or
command1 && command2
command1 || command2
2.15 循环语句
2.15.1 For循环
for var in arg1 arg2 ... argn
do
command
....
command
done
For循环示例
int=1
for $int in 1 2 3 4 5
do
sq=`expr $int /* $int`
echo $sq
int=`expr $int + 1`
done
2.15.2 while循环
while command
do
command
command
command
...
Done
While循环的示例
int=1
while [ $int -le 5 ]
do
sq=`expr $int /* $int`
echo $sq
int=`expr $int + 1`
done
2.15.3 until循环结构
until command
do
command
command
....
command
done
Until循环示例
int=1
until [ $int -gt 5 ]
do
sq=`expr $int /* $int`
echo $sq
int=`expr $int + 1`
done
2.16 从循环中退出: break和continue命令
break 立即退出循环
continue 忽略本循环中的其他命令,继续下一下循环
2.17 函数 (子过程)
funcname()
{
command
...
command; #分号
}
函数示例
setup ()
{ command list ; }
do_data ()
{ command list ; }
setup
do_data
2.18
使用-x进行跟踪执行,执行并显示每一条指令。
2.19 比较运算符
2.19.1 文件比较运算符
-e filename
-d filename
-f filename
-L filename
-r filename
-w filename
-x filename
filename1 -nt filename2 如果 filename1 比 filename2 新,则为真 [ /tmp/install/etc/services -nt /etc/services ]
filename1 -ot filename2 如果 filename1 比 filename2 旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]
2.19.2 字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)
-z string
-n string
string1 = string2 如果 string1 与 string2 相同,则为真 [ "$myvar" = "one two three" ]
string1 != string2 如果 string1 与 string2 不同,则为真 [ "$myvar" != "one two three" ]
2.19.3 算术比较运算符
num1 -eq num2
num1 -ne num2
num1 -lt num2
num1 -le num2
num1 -gt num2
num1 -ge num2
三. Shell 的一些注意事项
3.1. 基础
#!/bin/bash
#
3.2. 变量
变量赋值的时候"="两边的内容要紧靠"="
例如:sum=0,写java写的时间长了总喜欢写成sum = 0,但是这样的结果是编辑器不识别
3.3. 在使用if、while时,在注意变量与符号之间的分割
例如:if [ `expr $a % 3` -ne 0 ],while [ "$var" != "end" ],尽量分开写,这样也挺好看也便于识别。
3.4.
3.5. 大多数情况下,可以使用测试命令来对条件进行测试,比如可以比较字符串、判断文件是否存在及是否可读等等……通常用" [ ] "来表示条件测试,注意这里的空格很重要,要确保方括号前后的空格。
[ -f "somefile" ] :判断是否是一个文件
[ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限
[ -n "$var" ] :判断$var变量是否有值
[ "$a" = "$b" ] :判断$a和$b是否相等
3.6 几个简单例子
for filename in $(ls)
do
cat $filename
done
for((i=0; i<10; i++))
do
echo $i
done
x=1
sum=0
while [ $x -le 10 ]
do
let sum=sum+$x
let x=x+1
done
echo $sum
转自:http://blog.sina.com.cn/s/blog_5b1acf750101g9gn.html
将命令的输出读入一个变量中,可以将它放入双引号中,即可保留空格和换行符(\n)
out=$(cat text.txt)
输出1 2 3
out="$(cat text.txt)"
输出:
1
2
3
更多见:http://blog.csdn.net/aggrelxf/article/details/8263110
复合命令{}与()
反引号、$() 获取子程序的输出
变量
在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明,直接赋值就可以,应用变量的话,用$+变量名的形式。
a="hello world"
现在打印变量a的内容:
echo "A is:"
echo $a
有时候变量名很容易与其他文字混淆,比如:
num=2
echo "this is the $numnd"
这并不会打印出"this is the 2nd",而仅仅打印"this is the ",因为shell会去搜索变量numnd的值,
但是这个变量时没有值的。可以使用 花括号 来告诉shell我们要打印的是num变量:
num=2
echo "this is the ${num}nd"
这将打印: this is the 2nd
环境变量
由export关键字处理过的变量叫做环境变量。我们不对环境变量进行讨论,因为通常情况下仅仅在登录
脚本中使用环境变量。
1、EOF
Shell中通常将EOF与 << 结合使用,表示后续的输入作为子命令或子Shell的输入,直到遇到EOF为止,再返回到主调Shell。
可以把EOF替换成其他东西,意思是把内容当作标准输入传给程序。
回顾一下< <的用法。当shell看到< <的时候,它就会知道下一个词是一个分界符。在该分界符以后的内容都被当作输入,直到shell又看到该分界符(位于单独的一行)。这个分界符可以是你所定义的任何字符串。
例子:自动登录mysql(root:root,passwd:123456),查询test库,test1表里的user=aa的记录。
复制代码代码如下:
#!/bin/sh
MySQL -uroot -p123456 <<EOF
use test;
select * from testaa while a=10000; ###1000 not usr single quote mark,because a is int
# type,only char type need single quote mark.
exit
EOF
在shell脚本中可以使用任意的unix/linux命令,但是还是由一些相对更常用的命令。这些命令通常是用来
echo "some text": 将文字内容打印在屏幕上
ls: 文件列表
wc –l filewc或-w filewc或-c file : 计算文件行数;计算文件中的单词数;计算文件中的字符数
cp sourcefile destfile: 文件拷贝
mv oldname newname : 重命名文件或移动文件
rm file : 删除文件
grep 'pattern' file : 在文件内搜索字符串比如:grep 'searchstring' file.txt
cut -b colnum file : 指定欲显示的文件内容范围,并将它们输出到标准输出设备比如:输出
每行第5个到第9个字符cut -b5-9 file.txt
cat file.txt : 输出文件内容到标准输出设备(屏幕)上
file somefile : 得到文件类型
read var : 提示用户输入,并将输入赋值给变量
sort file.txt : 对file.txt文件中的行进行排序
uniq : 删除文本文件中出现的行列比如: sort file.txt | uniq
expr : 进行数学运算Example: add 2 and 3expr 2 "+" 3
find : 搜索文件比如:根据文件名搜索find . -name filename -print
tee: 将数据输出到标准输出设备(屏幕) 和文件比如:somecommand | tee outfile
basename file : 返回不包含路径的文件名比如: basename /bin/tux将返回 tux
dirname file : 返回文件所在路径比如:dirname /bin/tux将返回 /bin
head file : 打印文本文件开头几行
tail file : 打印文本文件末尾几行
sed: Sed是一个基本的查找替换程序。可以从标准输入(比如命令管道)读入文本,并将
结果输出到标准输出(屏幕)。该命令采用正则表达式(见参考)进行搜索。
不要和shell中的通配符相混淆。比如:将linuxfocus 替换为
LinuxFocus :cat text.file | sed 's/linuxfocus/LinuxFocus/' > newtext.file
awk : awk 用来从文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。
cat file.txt | awk -F, '{print $1 "," $3 }'这里我们使用,作为字段分割符,同时打印
第一个和第三个字段。如果该文件内容如下: Adam Bor, 34, IndiaKerry Miller, 22, USA
命令输出结果为:Adam Bor, IndiaKerry Miller
以 #!/bin/[解释器类型] 作为脚本内容的第一行。
比如使用的解释器为 bash,那么第一行就写 #!/bin/bash。同理,若解释器为 sh 就写 #!/bin/sh
如果脚本首行没有这句话,shell 的默认脚本解释器又不是你想用的解释器,那么执行脚本可能会出错。
脚本文件的后缀为 .sh。扩展名只是为了让用户更容易区分文件,没有扩展名的脚本也能运行。
执行脚本前要先使用命令 chmod +x filename.sh 为脚本添加可执行权限。
【注释】
使用 # 作为注释符号。没有多行注释,只能每一行加一个 # 号。
【变量】
分为 局部变量、环境变量、shell变量 3种。
一般变量:
variable_name=variable_value 声明变量或对变量赋值。等号两侧不能有空格。
variable_name=`command` 将命令 command 的执行结果赋值给变量 variable_name。符号 ` 是反引号,位于 Esc 键下方。
read variable_name 从 stdin 获取输入并赋值给 variable_name 变量
readonly variable_name 这条命令可以将变量 variable_name 设置为只读。
unset variable_name 删除变量 variable_name
特殊变量:
\$\$ 当前 shell 进程的PID。使用: echo \$\$(斜杠\ 在这里只用于转义,实际使用时应该只有 2 个美元符号而不输入斜杠)
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。$1 表示第一个参数,$2 表示第二个参数。
$# 传递给脚本或函数的参数个数
$* 传递给脚本或函数的所有参数。"$*"会将所有传入参数视为一个字符串。
$@ 传递给脚本或函数的所有参数。"$@"会将传入参数视为不同的字符串。$* 和 $@ 含义相同。注意有没有使用引号""的区别。
$? 上个命令的退出状态,或函数的返回值。一般命令执行成功返回0,否则返回非零值。
使用变量时要在变量名前加$,并且变量可以在引号中使用。例如 echo "Welcome, $name."
为了避免混淆,可以使用花括号将变量括起来。例如 echo "There are 2 ${animal}s."。
变量替换:
${var:-word} 如果变量 var 为空或已被删除,那么返回 word,但不改变 var 的值。
${var:=word} 如果变量 var 为空或已被删除,那么返回 word,并将 var 的值设置为 word。
${var:?message} 如果变量 var 为空或已被删除,那么将 message 输出到标准错误输出,并终止脚本运行。
${var:+word} 如果变量 var 已被定义,那么返回 word,但不改变 var 的值。
数组:
bash只支持一维数组,下标从 0 开始,没有长度限制。使用括号表示数组,使用空格隔开数组元素。
命令 array_name=(value0 value1 value2 ... valueN) 或者
命令 array_name=(
value0
value1
...
valueN
)
均可用于声明并定义一个数组。
array_name[N] 用于操作某个数组元素。
${array_name[N]} 表示某个数组元素的值。
array_name[*] 或 array_name[@] 表示数组中的所有元素。
${array_name[*]} 或 ${array_name[@]} 表示数组中所有元素的值。
${#array_name[*]} 或 ${#array_name[@]} 表示数组元素的个数。
${#array_name[N]} 表示某个数组元素的长度。
【数据输出】
echo -e "hello world!\n" 将输出 hello world![回车]。参数 -e 的功能是开启转义。
echo "hello world!\n" 将输出 hello world!\n。默认不进行转义。
printf "%d %s \n" 1949 "China" 将输出 1949 China[回车]。
用法与 C中 printf() 类似,区别在于调用时不必使用括号,传入的实参用空格隔开且格式化字符串可以重用。比如:
printf "%s %s %s\n" a b c d e f g h i j 的打印结果为:
a b c
d e f
g h i
j
command > /dev/null 2>&1 屏蔽标准输出stdout 和标准错误输出stderr
【数据输入】
read variable_name 从 stdin 读取数据存入变量 variable_name 中
【运算】
数值运算:
使用命令 expr 作为中介实现数值运算。
比如 val=`expr 2 + 2`;echo -e "Total value is: %{val}\n"
需要注意的是运算符和运算数之间必须用空格隔开,写成 2+2 是错误的。
乘法运算符 * 在使用时需要进行转义。比如 val=`expr $input \* 5`
逻辑运算:
常见于 if条件语句的判断语句中
== 数值相等,if[ $a == $b ];then
!= 数值不等,或字符串不同
-eq 数值相等
-ne 数值不等,if[ $c -ne $d ];then
-gt 数值大于
-ge 数值大于等于
-lt 数值小于
-le 数值小于等于
! 非,if[ !$val ];then
-o 或,if[ $a -gt 20 -o $b -gt 20 ];then
-a 且,if[ $c -eq 0 -a $d -le 100 ];then
= 字符串相同,if[ $str1 = $str2 ]
-z 字符串长度为零,if[ -z $str ]
-n 字符串长度不为零,if[ -n $str ]
str 字符串str是否为空,if[ str ]
-e 检测文件或目录是否存在,if[ -e $filedir ]
-s 检测文件是否为空
-b 检测文件是否为块设备文件
-c 检测文件是否为字符设备文件
-d 检测文件是否为目录
-f 检测文件是否是普通文件
-r 检测文件是否可读
-w 检测文件是否可写
-x 检测文件是否可执行
-g 检测文件是否设置了 SGID 位
-u 检测文件是否设置了 SUID 位
-k 检测文件是否设置了粘着位(Sticky Bit)
-p 检测文件是否是具名管道
字符串操作:
string="abcdefg"
echo ${#string} # 获取字符串 string 长度,输出 7
echo ${string:1:4} # 提取子字符串,输出 bcde
echo `expr index "$string" ef` # 查找子字符串 ef 在 $string 中的位置
【流程控制】
退出脚本:
exit NUM 退出脚本,并将状态号置为 NUM
条件语句:
需要注意的是在判断语句后,在 then 之前需要写分号; 才能将 if 和 then 写成 1 行,否则应该分成 2 行写。
判断语句使用 中括号[] 括起来,且表达式 expression 和 中括号[] 之间必须用空格隔开,否则会出现语法错误。
if [ expression ] ; then
....
elif [ expression ] ; then
....
else
....
fi
选择语句:
case VALUE in
value 1)
command1
;; # 两个分号,类似于 C 中的 break
value 2)
command2
;;
*) # 类似于 C 中的 default
commandDefault
;;
esac
for循环语句:
循环语句的执行范围 LIST 是一组值组成的序列,如数字序列、字符串、文件集合等,并且序列中的每个值用空格分隔。
for VAR in LIST;do
command1
command2
...
commandN
done
while循环语句:
while [ expression ];do
command1
command2
...
commandN
done
until循环语句:
until循环与while循环再处理方式上刚好相反。一般while循环优于until循环。
until [ expression ];do
command1
command2
...
commandN
done
跳出循环:
break 终止循环
continue 跳过当前判断分支的循环
【函数】
用于定义函数的关键字 function 可以忽略不写。
函数返回值必须是整数,一般来说,执行成功返回 0,否则返回非零值。若没有显示地写出 return 语句,最后一条命令的运行结果将作为返回值返回。
变量 $? 表示函数返回值。
变量 $1 表示函数的第 1 个参数,变量 ${10} 表示函数的第 10 个参数。最好使用 花括号{} 将序号括起来。
变量 $# 表示传入函数的参数个数。
function function_name () {
command1
command2
...
commandN
[return value]
}
【文件包含】
命令 . filename 和 source filename 都可以对外部脚本进行包含。注意,小数点符号. 和 filename 之间是使用空格隔开的。
作用相当于 C 中的 #include。用于使用文件 filename 中的变量和函数。