Shell 脚本基础学习笔记
Shell 脚本基础学习笔记
shell脚本的解释用“#”号,本文档为了习惯方便,解释大都用“//”,也有用“#”的SHELL 最基本的语法
基本元字符集及其含义(2008-05-24)
abc 表示abc 三個連續的字符, 但彼此獨立而非集合. (可簡單視為三個char set)
(abc) 表示abc 這三個連續字符的集合. (可簡單視為一個char set)
a|b 表示單一字符, 或a 或b .
(abc|xyz) 表示或abc 或xyz 這兩個char. set 之一. (註二)
[abc] 表示單一字符, 可為a 或b 或c . (與wildcard 之[abc] 原理相同)
[^abc] 表示單一字符, 不為a 或b 或c 即可. (與wildcard 之[!abc] 原理相同)
^ 只匹配行首
$ 只匹配行尾
* 只一个单字符后紧跟*,匹配0个或多个此单字符
[ ] 只匹配[ ]内字符。可以是一个单字符,也可以是字符序列。可以使用-表示[ ]内字符序列范围,如用[ 1 - 5 ]代替[ 1 2 3 4 5 ]
\ 只用来屏蔽一个元字符的特殊含义。因为有时在s h e l l中一些元字符有特殊含义。\可以使其失去应有意义
. 只匹配任意单字符
p a t t e r n \ { n \ } 只用来匹配前面p a t t e r n出现次数。n为次数
p a t t e r n \ { n,\ }含义同上,但次数最少为n
p a t t e r n \ { n,m \ }含义同上,但p a t t e r n出现次数在n与m之间
现在详细讲解其中特殊含义
1、使用句点匹配单字符
例一:beg.n:以beg开头,中间夹一个任意字符。
例二:. . . .X C. . . .:共10个字符,前四个之后为XC
例三:列出所有用户都有写权限的目录或文件:
ls -l |grep ...x..x..x
2、行首以^匹配字符串或字符序列
^只允许在一行的开始匹配字符或单词。
例如,使用ls -l命令,并匹配目录。
$ ls -l | grep ^d
3、在行尾以$匹配字符串或字符
可以说$与^正相反,它在行尾匹配字符串或字符,$符号放在匹配单词后。
例一:列出文件httpd1.conf中所有以单词common结尾的行
$grep common$ httpd1.conf
或
$cat httpd1.conf | grep common$
例二:匹配所有空行:^ $
例三:只返回包含一个字符的行:^.$
4、用\屏蔽一个特殊字符的含义
下列字符一般可以认为是特殊字符:
CODE:
$ . ' " * [] ^ | () \ + ?
QUOTE:
如:
\ .
反斜杠后面的字符不再是特殊字符,而是一个普通字符,即句点。
QUOTE:
假定要匹配包含^的各行,将反斜杠放在它前面就可以屏蔽其特殊含义:
\ ^
QUOTE:
在正则表达式中匹配以* . p a s结尾的所有文件:
\ * \ . p a s
即可屏蔽字符*的特定含义。
5、使用\{\}匹配模式结果出现的次数
使用*可匹配所有匹配结果任意次,但如果只要指定次数,就应使用\ { \ },QUOTE:
此模式有三种形式,即:
pattern\{n\} 匹配模式出现n次。
pattern\{n,\} 匹配模式出现最少n次。
pattern\{n,m\} 匹配模式出现n到m次之间,n , m为0 - 2 5 5中任意整数。
例一:匹配字母A出现两次,并以B结尾:
CODE:
A \ { 2 \ } B
匹配值为A A B
例二:匹配A至少4次:
CODE:
A \ { 4 , \ } B
可以得结果A A A A B或A A A A A A A B,但不能为A A A B。
例三:如给出出现次数范围,例如A出现2次到4次之间:
CODE:
A \ { 2 , 4 \ } B
则结果为A A B、A A A B、A A A A B,而不是A B或A A A A A B等。
例四:假定从下述列表中抽取代码:
QUOTE:
1234XC9088
4523XX9001
0011XA9912
9931Xc3445
格式如下:前4个字符是数字,接下来是x x,最后4个也是数字,操作如下:[ 0 - 9 ] \ { 4 \ }X X[ 0 - 9 ] \ { 4 \ }
QUOTE:
具体含义如下:
1) 匹配数字出现4次。
2) 后跟代码x x。
3) 最后是数字出现4次。
结果如下
QUOTE:
1234XC9088 -no match
4523XX9001 -match
0011XA9912 -no match
9931Xc3445 -no match
经常使用的正则表达式举例
CODE:
^ 对行首
$ 对行尾
^ [ t h e ] 对以t h e开头行
[ S s ] i g n a [ l L ] 对匹配单词s i g n a l、s i g n a L、S i g n a l、S i g n a L [Ss]igna[lL]\. 对同上,但加一句点
[ m a y M A Y ] 对包含m a y大写或小写字母的行
^ U S E R $ 对只包含U S E R的行
[tty]$ 对以t t y结尾的行
\ . 对带句点的行
^ d . . x . . x . . x 对对用户、用户组及其他用户组成员有可执行权限的目录
^ [ ^ l ] 对排除关联目录的目录列表
[ . * 0 ] 对0之前或之后加任意字符
[ 0 0 0 * ] 对0 0 0或更多个
[ iI] 对大写或小写I
[ i I ] [ n N ] 对大写或小写i或n
[ ^ $ ] 对空行
[ ^ . * $ ] 对匹配行中任意字符串
^ . . . . . . $ 对包括6个字符的行
[a- zA-Z] 对任意单字符
[ a - z ] [ a - z ] * 对至少一个小写字母
[ ^ 0 - 9 \ $ ] 对非数字或美元标识
[ ^ 0 - 0 A - Z a - z ] 对非数字或字母
[ 1 2 3 ] 对1到3中一个数字
[ D d ] e v i c e 对单词d e v i c e或D e v i c e
D e . . c e 对前两个字母为D e,后跟两个任意字符,最后为c e
\ ^ q 对以^ q开始行
^ . $ 对仅有一个字符的行
^\.[0-9][0-9] 对以一个句点和两个数字开始的行
' " D e v i c e " ' 对单词d e v i c e
D e [ V v ] i c e \ . 对单词D e v i c e或d e v i c e
[ 0 - 9 ] \ { 2 \ } - [ 0 - 9 ] \ { 2 \ } - [ 0 - 9 ] \ { 4 \ } 对日期格式d d - m m - y y y y
[ 0 - 9 ] \ { 3 \ } \ . [ 0 - 9 ] \ { 3 \ } \ . [ 0 - 9 ] \ { 3 \ } \ . [ 0 - 9 ] \ { 3 \ } 对I P地址格式nnn. nnn.nnn.nnn [ ^ . * $ ] 对匹配任意行
判断/tmp/mybook是否存在.若不存在则创建
[ ! -d /tmp/mybook ]&&mkdir /tmp/mybook&&echo "/tmp/mybook is created!" ||echo "/tmp/mybook is exist!" //这行比较麻烦.有点错都会出问题.注意方括号内的两边有空格.该空格的地方要空格
shell使用两种引号和反斜线
双引号“”(让引号内的变量生效)
单引号‘’(引号内的变量当作一个字符使用)
反斜线\(禁用特殊字符功能\$)
后引号``(让引号内的命令生效)
单引号和双引号的区别在于:单引号是原样显示,双引号则显示出变量的值。
echo time is:
'date'
abc="100"
echo 'time is: $abc'
echo "time is: $abc"
有时候变量名很容易与其他文字混淆,比如:
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" //或者echo "this is the $[num]nd"
这将打印:this is the 2nd
流程控制
1) if
"if" 表达式如果条件为真则执行then后面的部分:
if 条件1 #如果条件1为真
then #那么
command1 #执行命令1
elif 条件2 # 如果条件2为真
then #那么
command2 # 执行命令2
else #如果条件1和条件2都不成立
command3 执行命令3
fi #完成(if 语句一定要以fi结束)大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等…
通常用" [ ] "来表示条件测试。注意这里的空格很重要。要确保方括号的空格。
[ -f "somefile" ] :判断是否是一个文件
[ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限
[ -n "$var" ] :判断$var变量是否有值
[ "$a" = "$b" ] :判断$a和$b是否相等
例如:
//变量$SHELL包含了登录shell的名称,我们和/bin/bash进行了比较
if [ "$SHELL" = "/bin/bash" ]; then
echo "your login shell is the bash (bourne again shell)"
else
echo "your login shell is not bash but $SHELL"
fi
[ -f "/etc/shadow" ] && echo "This computer uses shadow passwors"
这里&& 就是一个快捷操作符,如果左边的表达式为真则执行右边的语句。
您也可以认为是逻辑运算中的与操作。上例中表示如果/etc/shadow文件存在则打印” This computer uses shadow passwors”。
2) case
case :表达式可以用来匹配一个给定的字符串,而不是数字。
case 值in
模式1)#如果模式1匹配
命令1 #执行命令1
;;
模式2)#如果模式2匹配
命令2 #执行命令2
;;
*)#如果以上模式都不匹配
命令3 #执行命令3
;;
esac #结束case语句
case取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至;;。模式匹配符号*表示匹配任意字符。[。。]表示类或者范围中的任意字符。
让我们看一个例子。file命令可以辨别出一个给定文件的文件类型,比如:
file test.gz
这将返回:
test.gz: gzip compressed data, deflated, original filename,
last modified: Mon Aug 27 23:09:18 2001, os: Unix
我们利用这一点写了一个叫做smartzip的脚本,该脚本可以自动解压bzip2, gzip 和zip 类型的压缩文件:#!/bin/sh
ftype=`file "$1"`
case "$ftype" in
"$1: Zip archive"*)
unzip "$1" ;;
"$1: gzip compressed"*)
gunzip "$1" ;;
"$1: bzip2 compressed"*)
bunzip2 "$1" ;;
*) echo "File $1 can not be uncompressed with smartzip";;
esac
您可能注意到我们在这里使用了一个特殊的变量$1。该变量包含了传递给该程序的第一个参数值。
也就是说,当我们运行:
smartzip articles.zip
$1 就是字符串articles.zip
3) selsect
select 表达式是一种bash的扩展应用,尤其擅长于交互式使用。用户可以从一组不同的值中进行选择。select var in ... ; do
break
done
.... now $var can be used ....
下面是一个例子:
#!/bin/sh
echo "What is your favourite OS?"
select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do
break
done
echo "You have selected $var"
下面是该脚本运行的结果:
What is your favourite OS?
1) Linux
2) Gnu Hurd
3) Free BSD
4) Other
#? 1
You have selected Linux
4)for循环
for 变量名in 列表
do
命令1
命令2
done
当变量值在列表里,for 循环即执行一次所有命令,使用变量名访问列表取值。命令可为任何有效的shell命令和语句。变量名为任何单词。in列表用法是可选的,如果不用它,for循环使用命令行的位置参数。in列表可以包含替换,字符串和文件名
举例说明:
for loop in 1 2 3 4 #在1 2 3 4列表中循环(4次)
do #开始执行命令
echo "hello" #执行命令
done #完成
输出结果:
hello
hello
hello
hello
for loop in "one two three" #当成一个元素只循环一次
do
echo $loop
done
#输出one two three 一行
for loop in one two three #三次循环
do
echo $loop
done
#输出
one
列表也可以是文件,如:for loop in `cat myfile`
5) while循环
while 命令
do
命令1
命令2
......
done
举例说明:
while read LINE do echo $LINE #输出每行的信息 done getopts用法 获取多个命令行参数。举例说明: #!/bin/bash #getopts ALL=false HELP=false FILE=false VERBOSE=false while getopts ahfvc: OPTION #将ahfvc依次传给OPTION 。c后面的冒号:表示-c时需传入参数do case ${OPTION} in a) ALL=true echo "ALL IS ${ALL}" ;; h) HELP=true echo "HELP IS ${HELP}" ;; f) FILE=true echo "FILE IS ${FILE}" ;; v) VERBOS=false echo "VERBOSE IS ${VERBOSE}" c=${OPTARG} echo "c value is $c" ;; \?) echo "`basename $0` -[a h f v] -[c value] file" ;; esac done 运行结果: 输入./getopts -a 输出:ALL IS true #执行case a模式的命令 输入./getopts -h 输出:HLEP IS true #执行case h模式的命令 输入./getopts -f 输出:FILE IS true #执行case f模式的命令 输入./getopts -v 输出:VERBOSE IS true #执行case v模式的命令 输入./getopts -c 提示错误:需要传入参数#c后面有“:”所以需传参数 输入./getopts -c hello 输出:c value is hello #执行case c模式的命令 输入./getopts -b 输出:basename ./getopts -[a h f v] -[c value] file #其他情况 awk用法 #!/bin/awk -f #注明是awk的语法,若无此行则按bash的语法编译会出错 #awk_array.sh BEGIN{ #BEGIN模式中的命令 FS="#" score["0-60"]=0 #score数组索引为"0-60"的元素(awk语法允许用字符串索引)score["60-70"]=0 score["70-80"]=0 score["80-90"]=0 score["90-100"]=0 student["junior"]=0 student["senior"]=0 } { { if ($1<60) #如果第一个域的值小于60 score["0-60"]++ #score数组中索引为"0-60"的元素值+1 } { if($1>=60 && $1<70) score["60-70"]++ } { if($1>=70 && $1<80) score["70-80"]++ } { if($1>=80 && $1<90) score["80-90"]++ } { if($1>=90&&$1<=100) score["90-100"]++ } } { #另senior_junior依次为student数组中的索引(有几个就循环几次) for (senior_junior in student) {if ($2==s enior_junior) student[senior_junior]++ } } END{ { for (number in score) print "the score",number,"has",score[number],"students"} { for (senior_junior in student) print "The class has ",student[senior_junior],senior_junior,"students" } } 若有文件grade.txt如下: 85#senior 87#junior 78#junior 69#senior 56#junior 98#senior 83#senior 输入命令./awk.sh grade.txt 则输出如下: the score 0-60 has 1 students the score 70-80 has 1 students the score 90-100 has 1 students the score 60-70 has 1 students the score 80-90 has 3 students The class has 4 senior students The class has 3 junior students 以时间为标识的日志文件。适用于长期存储的日志。 举个创建以时间为标识日志的例子入下: #!/bin/bash #datelog.sh current_date=`date ""+%Y%m%d` #当前的日期(年月日) todaylog="/tmp/${current_date}.log" #今天日志的(绝对路径)文件名。也即该文件在/tmp目录下#如果日志文件不存在,创建一个 if [ ! -f $todaylog ] then touch $todaylog fi #输出日志到日志文件 log_time_format=`date "+%Y-%m-%d %T"` echo "${log_time_format} commands start.....">>${todaylog} # commands blocks。例如这里将errpt报错及df –g命令结果输出到${todaylog}所示的日志文档 errpt>>${todaylog} df -g>>$todaylog // $todaylog与${todaylog}相同 sleep 4 log_time_format=`date "+%Y-%m-%d %T"` echo "${log_time_format} commands end!">>${todaylog} #结束时记录日志 (标准输入)<< 举例来说明: #!/bin/bash #input.sh cat< *************************** This is a test! *************************** hello #标准输入到此行之前结束(注意:这个hello必须在句首,其前面不能有任何字符,甚至是空格)则输出: **************************** This is a test! **************************** trap捕捉信号 (1)信号可以被应用程序或脚本捕获,并依据该信号(1、2、3和15)采取相应的行动。一些信号不能被捕获。如,如果一个命令收到了信号9,就无法再捕获其他信号。 (2)捕捉到一个信号后,可能会采取三中 1].不采取任何行动,由系统来进行处理(如信号9由系统处理) 2].捕获该信号,但忽略它 3].捕获该信号,并采取相应的行动 (3)trap可以使你在脚本中捕捉信号,命令形式为trap name signal(s) 其中,name是捕捉到信号以后所采取的一系列操作。实际中,name一般是一个专门用来处理所捕捉信号的函数。name需要用双引号(“”)引起来。signal是待捕捉的信号。 最常见的行动包括: 1]清除临时文件 2]忽略该信号(如trap "" 23) 3]询问用户是否终止该脚本进程 (4)举例说明: #!/bin/bash #trap.sh trap “exitprocess” 2#捕捉到信号2之后执行exitprocess function LOOP=0 function exitprocess() { echo "You Just hit echo "I will now exit" exit 1 } while : # 循环直到捕捉到信号(注意中间的空格) do LOOP=$[ $LOOP+1 ] echo $LOOP sleep 1 done 有好多方法可以实现对输入参数的分析,但是下面的使用case表达式的例子无遗是一个不错的方法。 #!/bin/sh # cmdparser.sh help() { cat This is a generic command line parser demo. USAGE EXAMPLE: ./cmdparser.sh -l hello -f -- -somefile1 somefile2 HELP exit 0 #exit 0表示本函数执行到此,shell程序就会退出,不再执行下面的语句。如果这里没exit 0,则本函数执行完后,继续执行下面的语句。 } while [ -n "$1" ]; do case $1 in -h) help;shift 1;; # function help is called -f) opt_f=2;shift 1;; # variable opt_f is set -l) opt_l=$2;shift 2;; # -l takes an argument -> shift by 2 --) shift;break;; # end of options -*) echo "error: no such option $1. -h for help";exit 1;; *) break;; esac done echo "opt_f is $opt_f" echo "opt_l is $opt_l" echo "first arg is $1" echo "second arg is $2" 您可以这样运行该脚本: cmdparser -l hello -f -- -somefile1 somefile2 返回的结果是: opt_f is 2 opt_l is hello first arg is -somefile1 second arg is somefile2 这个脚本是如何工作的呢?脚本首先在所有输入命令行参数中进行循环,将输入参数与case表达式进行比较,如果匹配则设置一个变量并且移除该参数。根据unix系统的惯例,首先输入的应该是包含减号的参数. 设计一个Shell程序,在/userdata目录下建立50个目录,即user1~user50,并设置每个目录的权限为rwxr-xr— 方法一: #!/bin/bash #最简单,效率最高的办法 mkdir -p /userdata/{1..50} && chmod 754 /userdata/{1..50} 方法二: 用for或while循环 #!/bin/bash i=0 while [ $i -lt 50 ];do let i=i+1 mkdir -p /userdata/$i chmod 754 /userdata/$i done 方法三: #!/bin/bash for D in /userdata/{1..20} do mkdir -m 754 -p $D done echo "Completed" 系统中有个文件,文件名为ABC.txt。如何将当前的系统时间追加到此文件行首? 方法一: echo -e "`date`\n`cat ABC.txt`" > ABC.txt //不晓得-e是什么意思,但如果没有-e,则追加到行首文本不会 换行 方法二: echo "`date | cat - ABC.txt`" > ABC.txt 关于$* 与$@ 的说明 $* 以单变量的形式显示所有的参数列表,由环境变量IFS中的第一个字符分隔. $@ $*的一个灵巧变形.他并不使用IFS环境变量,所以如果IFS为空那么所有的所有的参数会一起运行. 我们可以通过下面的测试容易的看出$@和$*的区别: $ IFS=’’ $ set foo bar bam $ echo “$@” foo bar bam $ echo “$*” foobarbam $ unset IFS $ echo “$*” foo bar bam 正如我们所看到的,在双引号内,$@将参数进行分隔显示,而与IFS的值无关.通常来说,如果我们要访问参数,$@是一个很灵敏的选择. Shell变量 主要有本地变量和环境变量。 1、本地变量--在用户现有运行的脚本中使用 1) 定义本地变量格式:variable-name=value 例子:[root@jike1 /root]# LOCALTEST="test" [root@jike1 /root]# echo $LOCALTEST (注意:echo $LOCALTEST 和echo ${LOCALTEST}的效果是一样的) (在变量名前加$, 可以取得此变量的值,使用echo命令可以显示变量的值) 2) 显示本地变量格式:set 例子:[root@chinaitlab root]# set 3) 清除本地变量格式:unset variable-name 例如:[root@jike1 /root]# unset LOCALTEST 此时再执行echo $LOCALTEST将看不到变量LOCALTEST的输出。 2、环境变量--在所有的子进程中使用 1) 定义环境变量格式:export variable-name=value (与本地变量的定义相比,多了一个export 关键字) 例子:[root@chinaitlab /root]# export DOMAIN="https://www.360docs.net/doc/c18687632.html," [root@ chinaitlab shell]# vi testenv.sh #!/bin/bash #表示用bash来解析脚本 #testenv.sh echo $DOMAIN [root@chinaitlab shell]# chmod +x testenv.sh [root@chinaitlab shell]# ./testenv.sh https://www.360docs.net/doc/c18687632.html, 2) 显示环境变量格式:env (本地变量的显示使用set,环境变量的显示使用env) 例子:[root@chinaitlab test]# env 3) 清除环境变量格式:unset variable-name (用法与本地变量相同,都使用unset) 例子:[root@chinaitlab shell]# unset DOMAIN 此时再执行./testenv.sh将看不到变量DOMAIN的输出。 3、其它变量 1) 位置变量$0,$1,$2,$3……$9 2) 只读变量readonly variable 注意:只读变量不能被清除和改变其值,所以要谨慎使用。 3) 特殊变量$#,$?,$$(表示当前进程的PID)…… cat命令的一点用法 1. 创建一个包含myfile1、myfile2、myfile3三个文件内容,名为b i g f i l e的文件: cat myfile1 myfile2 myfile3 > bigfile 2. 用cat新建文件 $cat >myfile Hello This is great $cat myfile Hello This is great 3. 显示myile文件,并带有行号 cat –n myfile 把myfile 的内容加上行号后输入myfile1这个文件里 cat -n myfile > myfile1 显示myfile文件的内容,同时拷贝文件为file1、file2、file3。 cat myfile | tee file1 file2 file3 //tee命令:读取标准输入的数据,并将其内容输出成文件。 Shell Shell 就是用户与操作系统内核之间的接口,起着协调用户与系统的一致性和在用户与系统之间进行交互的作用。 4.1.1 Shell 的基本概念 1. 什么是S hell Shell 就是用户与操作系统内核之间的接口,起着协调用户与系统的一致性和在用户与系统之间进行交互的作用。Shell 在L inux 系统中具有极其重要的地位,如图4-1 所示 第 4 章 Shell 与 V i 编辑器 - 71 - diff grep vi multitasking sh gcc device hardware interface kernn e l TCP/IP stack bash utilii t es 图 4-1 Linux 系统结构组成 2. Shell 的功能 Shell 最重要的功能是命令解释,从这种意义上来说,Shell 是一个命令解释器。Linux 系统中的所有可执行文件都可以作为 Shell 命令来执行。将可执行文件作一个分类,如表 4-1 所示。 表 4-1 可执行文件的分类 部的解释器将其解释为系统功能调用并转交给内核执行;若是外部命令或实用程序就试图 在硬盘中查找该命令并将其调入内存,再将其解释为系统功能调用并转交给内核执行。在 查找该命令时分为两种情况: 用户给出了命令路径,Shell 就沿着用户给出的路径查找,若找到则调入内存,若没有 则输出提示信息; 用户没有给出命令的路径,Shell 就在环境变量 PATH 所制定的路径中依次进行查找, 若找到则调入内存,若没找到则输出提示信息。 图 4-2 描述了 S hell 是如何完成命令解释的。 linux shell脚本语言基础知识 一.shell简介 Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的界面,更确切的说,shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用Shell脚本编程,完成更加复杂的操作。 shell是一个命令解释器,它从输入设备读取命令,再将其转为计算机可以了解的指令,然后执行它。在linux中,shell又不仅是简单的命令解释器,而且是一个全功能的编程环境。 Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell (/usr/bin/ksh)、Shell for Root(/sbin/sh),等等。不同的Shell语言的语法有所不同,所以不能交换使用。每种Shell都有其特色之处,基本上,掌握其中任何一种就足够了。通常用Bash,也就是Bourne Again Shell进行编程。 二.shell使用 1.建立和运行shell程序 shell脚本程序:按照一定的语法结构把若干linux命令组织在一起,是这些命令按照我们的要求完成一定的功能。它可以进行类似程序的编写,并且不需要编译就能执行。(只需修改其权限) 像编写高级语言的程序一样,编写shell程序需要一个文本编辑器,如VI和VIM,通常使用VIM文本编辑器,支持更便利的插入模式。 首先使用VIM编辑器编辑一个hello.sh文件: #!/bin/bash #hello world example ubuntu shell 使用命令大全 前言 下面的命令大都需要在控制台/ 终端/ shell 下输入。 控制台, 终端, 和shell 意味着同样一件事- 一个命令行界面,他可以用来控制系统。 打开一个控制台: 应用程序--> 附件--> 终端 任何一个使用'sudo' 作为前缀的命令都需要拥有管理员(或root) 访问权限。所以你会被提示输入你自己的密码。 安装升级 查看软件xxx安装内容 dpkg -L xxx 查找软件库中的软件 apt-cache search 正则表达式 或 aptitude search 软件包 显示系统安装包的统计信息 apt-cache stats 显示系统全部可用包的名称 apt-cache pkgnames 显示包的信息 apt-cache show k3b 查找文件属于哪个包 apt-file search filename 查看已经安装了哪些包 dpkg -l 查询软件xxx依赖哪些包 apt-cache depends xxx 查询软件xxx被哪些包依赖 apt-cache rdepends xxx 增加一个光盘源 sudo apt-cdrom add 系统升级 sudo apt-get update (这一步更新包列表) sudo apt-get dist-upgrade (这一步安装所有可用更新) 或者 sudo apt-get upgrade (这一步安装应用程序更新,不安装新内核等) 清除所有已删除包的残馀配置文件 dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P 如果报如下错误,证明你的系统中没有残留配置文件了,无须担心。 dpkg: --purge needs at least one package name argument Type dpkg --help for help about installing and deinstalling packages [*]; Use `dselect' or `aptitude' for user-friendly package management; Type dpkg -Dhelp for a list of dpkg debug flag values; Type dpkg --force-help for a list of forcing options; Type dpkg-deb --help for help about manipulating *.deb files; Type dpkg --license for copyright license and lack of warranty (GNU GPL) [*]. Options marked [*] produce a lot of output - pipe it through `less' or `more' ! 编译时缺少h文件的自动处理 sudo auto-apt run ./configure 查看安装软件时下载包的临时存放目录 #!/bin/bash 放在第一行用于告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。文件保存为**.sh。 执行方式: 1.chmod777 test.sh ./test.sh 2./bin/sh test.sh echo 用于向窗口输出文本 定义变量时,变量名不加$符号。 例如:your_name="https://www.360docs.net/doc/c18687632.html," 还可以使用语句进行赋值: for file in `ls /etc` 或 for file in $(ls /etc) 以上语句将/etc 下目录的文件名循环出来。 使用变量 使用一个定义过的变量,只要在变量名前面加美元符号即可,如: your_name="qinjx" echo $your_name echo ${your_name} 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,建议给所有变量加上花括号。 只读变量 readonly+变量名 删除变量 unset+变量名不能删除只读变量 Shell 字符串 字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。单双引号的区别跟PHP 类似。 单引号 str='this is a string' 单引号字符串的限制: 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的; 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。 双引号 your_name='qinjx' str="Hello, I know you are \"$your_name\"! \n" 双引号的优点: 双引号里可以有变量 双引号里可以出现转义字符 拼接字符串 your_name="qinjx" greeting="hello, "$your_name" !" greeting_1="hello, ${your_name} !" echo $greeting $greeting_1 获取字符串长度 string="abcd" echo ${#string} 输出4 提取子字符串 以下实例从字符串第2 个字符开始截取4 个字符:string="runoob is a great site" echo ${string:1:4} 输出unoo 查找子字符串 Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell 是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统的关键。可以说,shell使用的熟练程度反映了用户对Linux使用的熟练程度。 一、什么是shell 当一个用户登录Linux系统之后,系统初始化程序init就为每一个用户运行一个称为shel l(外壳)的程序。那么,shell是什么呢?确切一点说,shell就是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell 来启动、挂起、停止甚至是编写一些程序。 当用户使用Linux时是通过命令来完成所需工作的。一个命令就是用户和shell之间对话的一个基本单位,它是由多个字符组成并以换行结束的字符串。shell解释用户输入的命令,就象DOS里的https://www.360docs.net/doc/c18687632.html,所做的一样,所不同的是,在DOS中,https://www.360docs.net/doc/c18687632.html,只有一个,而在Linux下比较流行的shell有好几个,每个shell都各有千秋。一般的Linux系统都将bash作为默认的shell。 二、几种流行的shell 目前流行的shell有ash、bash、ksh、csh、zsh等,你可以用下面的命令来查看你自己的shell类型: #echo $SHELL $SHELL是一个环境变量,它记录用户所使用的shell类型。你可以用命令: #shell-name 来转换到别的shell,这里shell-name是你想要尝试使用的shell的名称,如ash等。这个命令为用户又启动了一个shell,这个shell在最初登录的那个shell之后,称为下级的shell或子shell。使用命令: $exit 可以退出这个子shell。 使用不同的shell的原因在于它们各自都有自己的特点,下面作一个简单的介绍: 1.ash ash shell是由Kenneth Almquist编写的,Linux中占用系统资源最少的一个小shell,它只包含24个内部命令,因而使用起来很不方便。 2.bash bash是Linux系统默认使用的shell,它由Brian Fox和Chet Ramey共同完成,是Bourne Again Shell的缩写,内部命令一共有40个。Linux使用它作为默认的shell是因为它有诸如以下的特色: (1)可以使用类似DOS下面的doskey的功能,用方向键查阅和快速输入并修改命令。 (2)自动通过查找匹配的方式给出以某字符串开头的命令。 (3)包含了自身的帮助功能,你只要在提示符下面键入help就可以得到相关的帮助。 3.ksh ksh是Korn shell的缩写,由Eric Gisin编写,共有42条内部命令。该shell最大的优点是几乎和商业发行版的ksh完全兼容,这样就可以在不用花钱购买商业版本的情况下尝试商业版本的性能了。 4.csh Linux 操作系统shell学习笔记(linux系统) linux软件开发 No.001 文件安全与权限 1. umask 决定了新建文件的权限 2. 软链接(符号链接) ln -s source_path target_path No.002 find和xargs 1. find pathname -options [-print -exec -ok] 其中exec参数的命令格式:'command-' {} \; 注意必须包含【{} \;】 -perm 按权限来查找ex. find . -perm 755 -print -mtime 按修改时间来查找ex. find / -mtime -5 -print 更改时间5天以内 find / -mtime +5 -print 更改时间5天以前 2. xargs与-exec和-ok类似,但是限制更少,也更快 3种参数的命令:find . -name "*.c" -exec wc -l {} \; find . -name "*.c" -ok wc -l {} \; 每次执行命令前有提示 find . -name "*.c" | xargs wc -l No.003 后台执行命令 1. [crontab] [at] [&] [nohup]四种 No.004 文件名置换 1. 列出隐藏文件ex. ls .* No.005 shell输入与输出 1. echo输出时加上-n 参数不换行,ex. echo -n "aaaa" 2. tee 命令可以同时输出到屏幕和文件中ex. ls | tee file.out 3. 标准输入0 标准输出1 标准错误2 4. 将标准输出和标准错误输入到一个文件ex. command >file.out 2>&1 No.006 命令执行顺序 1. 命令1 && 命令2 命令1执行成功后才会执行命令2 2. 命令1 || 命令2 命令1执行失败后才会执行命令2 No.007 正则表达式 1. 正则表达式元字符及含义 ^ 只匹配行首 $ 只匹配行尾 作者:佚名字体:[增加减小] 来源:互联网时间:03-06 21:54:44我要评论 一篇非常好的linux学习笔记分享,对于常用命令整理的比较详细,推荐使用。 linux目录架构 / 根目录 /bin 常用的命令binary file 的目錄 /boot 存放系统启动时必须读取的档案,包括核心(kernel) 在内 /boot/grub/menu.lst GRUB设置 /boot/vmlinuz 内核 /boot/initrd 核心解壓縮所需RAM Disk /dev 系统周边设备 /etc 系统相关设定文件 /etc/DIR_COLORS 设定颜色 /etc/HOSTNAME 设定用户的节点名 /etc/NETWORKING 只有YES标明网络存在 /etc/host.conf 文件说明用户的系统如何查询节点名 /etc/hosts 设定用户自已的IP与名字的对应表 /etc/hosts.allow 设置允许使用inetd的机器使用 /etc/hosts.deny 设置不允许使用inetd的机器使用 /etc/hosts.equiv 设置远端机不用密码 /etc/inetd.conf 设定系统网络守护进程inetd的配置 /etc/gateways 设定路由器 /etc/protocols 设定系统支持的协议 /etc/named.boot 设定本机为名字服务器的配置文件 /etc/sysconfig/network-scripts/ifcfg-eth0 设置IP /etc/resolv.conf 设置DNS /etc/X11 X Window的配置文件,xorg.conf 或XF86Config 這兩個X Server 的設定檔/etc/fstab 记录开机要mount的文件系统 /etc/inittab 设定系统启动时init进程将把系统设置成什么样的runlevel /etc/issue 记录用户登录前显示的信息 /etc/group 设定用户的组名与相关信息 /etc/passwd 帐号信息 /etc/shadow 密码信息 /etc/sudoers 可以sudo命令的配置文件 /etc/securetty 设定哪些终端可以让root登录 /etc/login.defs 所有用户登录时的缺省配置 很实用的Shell脚本(实践版) /erpHome/shell/old/$1/$2.zip.old find . -mtime +7 | xargs nice -n 20 zip -qm /erpHome/shell/old/$1/$2_$DayOfWeek.zip # find . -mtime +7 Fi archiveOld2.sh . /erpHome/shell/setP.sh export DayOfWeek=`date +"%u"` if test "$#" -lt 1 || test -z "$1" then echo At least one argument needed. exit fi if test ! -e "$ShellHome/old/$1" then cd $ShellHome/old/ mkdir -p $1 fi if test ! -e "$ERPHome/$1" then echo "$ERPHome/$1" "does not exist" exit fi cd $ERPHome/$1 mv $ShellHome/old/$1_$DayOfWeek.zip $ShellHome/old/$1.zip.old find . -mtime +7 -type f | xargs nice -n 20 zip -qm $ShellHome/old/$1_$DayOfWeek.zip #find . -mtime +7 -type f archiveOldAll.sh /erpHome/shell/archiveOld.sh work/dr/engine jrprint /erpHome/shell/archiveOld.sh work/de tmp /erpHome/shell/archiveOld2.sh public 第12章 Shell 脚本编程 ● Shell 命令行的运行 ● 编写、修改权限和执行Shell 程序的步骤 ● 在Shell 程序中使用参数和变量 ● 表达式比较、循环结构语句和条件结构语句 ● 在Shell 程序中使用函数和调用其他Shell 程序 12-1 Shell 命令行书写规则 ◆ Shell 命令行的书写规则 对Shell 命令行基本功能的理解有助于编写更好的Shell 程序,在执行Shell 命令时多个命令可以在一个命令行上运行,但此时要使用分号(;)分隔命令,例如: [root@localhost root]# ls a* -l;free;df 长Shell 命令行可以使用反斜线字符(\)在命令行上扩充,例如: [root@localhost root]# echo “ this is \ >long command ” This is long command 注意: “>”符号是自动产生的,而不是输入的。 12-2 编写/修改权限及执行Shell 程序的步骤 ◆ 编写Shell 程序 ◆ 执行Shell 程序 Shell 程序有很多类似C 语言和其他程序设计语言的特征,但是又没有程序语言那样复杂。Shell 程序是指放在一个文件中的一系列Linux 命令和实用程序。在执行的时候,通过Linux 操作系统一个接一个地解释和执行每条命令。首先,来编写第一个Shell 程序,从中学习Shell 程序的编写、修改权限、执行过程。 12-2-1 编辑Shell程序 编辑一个内容如下的源程序,保存文件名为date,可将其存放在目录/bin下。 [root@localhost bin]#vi date #! /bin/sh echo “Mr.$USER,Today is:” echo &date “+%B%d%A” echo “Wish you a lucky day !” 注意: #! /bin/sh通知采用Bash解释。如果在echo语句中执行Shell命令date,则需要在date 命令前加符号“&”,其中%B%d%A为输入格式控制符。 12-2-2 建立可执行程序 编辑完该文件之后不能立即执行该文件,需给文件设置可执行程序权限。使用如下命令。[root@localhost bin]#chmod +x date 12-2-3 执行Shell程序 执行Shell程序有下面三种方法: 方法一: [root@localhost bin]#./ date Mr.root,Today is: 二月 06 星期二 Wish you a lucky day ! 方法二: 另一种执行date的方法就是把它作为一个参数传递给Shell命令: [root@localhost bin]# Bash date Mr.root,Today is: 二月 06 星期二 Wish you a lucky day ! 方法三: 为了在任何目录都可以编译和执行Shell所编写的程序,即把/bin的这个目录添加到整个环境变量中。 具体操作如下: [root@localhost root]#export PATH=/bin:$PATH [root@localhost bin]# date Mr.root,Today is: 二月 06 星期二 Wish you a lucky day ! PACATTCP学习笔记 一.PACATTCP是什么(以下内容来自PACATTCP官方网站英文翻译) TTCP,即Test TCP,是命令行下执行的带宽测试软件,用于测试两个系统间TCP和UDP的性能表现。 二.PACATTCP运行环境 PCATTCP是Win32命令行程序,必须运行于命令行或者是批处理文件,现在也有了UNIX和LINUX下的运行程序。PCATTCP运行需要两个Windows平台,或者一个Windows平台与一个Linux平台,其中一个作为接收端,一个作为发送端。 三.PACATTCP使用 1.开启接收端 打开命令行,切换到PACATTCP所在的目录,执行:pcattcp –r ,即可启动PCATTCP接收端。 2.开启发送端 打开命令行,切换到PACATTCP所在的目录,执行:pcattcp –t 接收端IP ,即可启动与接收端的带宽测试连接。 四.应用举例 1.IPv4环境下应用 接收端: C:\Users\xiaoming>PCATTCP.exe -r -f M -c PCAUSA Test TCP Utility V2.01.01.14 (IPv4/IPv6) IP Version : IPv4 Started TCP Receive Test 0... TCP Receive Test Local Host : xiaoming-PC ************** Listening...: On TCPv4 0.0.0.0:5001 Accept : TCPv4 0.0.0.0:5001 <- 172.22.101.3:54974 Buffer Size : 8192; Alignment: 16384/0 Receive Mode: Sinking (discarding) Data Statistics : TCPv4 0.0.0.0:5001 <- 172.22.101.3:54974 4274257920 bytes in 80.152 real seconds = 50.86 MB/sec +++ numCalls: 525749; msec/call: 0.156; calls/sec: 6559.372 参数解释: -r 启动接收端 -f M 以M为单位显示带宽 -c 持续接受,直到手动终止(CTRL + C) 文中标红位置为带宽测试结果 发送端: C:\Users\xiaoming>PCATTCP.exe -t -f M -c 172.22.101.3 PCAUSA Test TCP Utility V2.01.01.14 (IPv4/IPv6) IP Version : IPv4 Started TCP Transmit Test 0... TCP Transmit Test 1. find find pathname -options [-print -exec -ok] 让我们来看看该命令的参数: pathname find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。 -print find命令将匹配的文件输出到标准输出。 -exec find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {} \;,注意{}和\;之间的空格,同时两个{}之间没有空格, 注意一定有分号结尾。 0) -ok 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行 find . -name "datafile" -ctime -1 -exec ls -l {} \; 找到文件名为datafile*, 同时创建实际为1天之内的文件, 然后显示他们的明细. find . -name "datafile" -ctime -1 -exec rm -f {} \; 找到文件名为datafile*, 同时创建实际 为1天之内的文件, 然后删除他们. find . -name "datafile" -ctime -1 -ok ls -l {} \; 这两个例子和上面的唯一区别就是-ok会在每个文件被执行命令时提示用户, 更加安全. find . -name "datafile" -ctime -1 -ok rm -f {} \; 1) find . -name 基于文件名查找,但是文件名的大小写敏感. find . -name "datafile*" 2) find . -iname 基于文件名查找,但是文件名的大小写不敏感. find . -iname "datafile*" 3) find . -maxdepth 2 -name fred 找出文件名为fred,其中find搜索的目录深度为2(距当前目录), 其中当前目录被视为第一层. 4) find . -perm 644 -maxdepth 3 -name "datafile*" (表示权限为644的, 搜索的目录深度为3, 名字为datafile*的文件) 5) find . -path "./rw" -prune -o -name "datafile*" 列出所有不在./rw及其子目录下文件名为datafile*的文件。 find . -path "./dir*" 列出所有符合dir*的目录及其目录的文件. find . \( -path "./d1" -o -path "./d2" \) -prune -o -name "datafile*" 列出所有不在./d1和d2及其子目录下文件名为datafile*的文件。 6) find . -user ydev 找出所有属主用户为ydev的文件。 find . ! -user ydev 找出所有属主用户不为ydev的文件,注意!和-user之间的空格。 7) find . -nouser 找出所有没有属主用户的文件,换句话就是,主用户可能已经被删除。 8) find . -group ydev 找出所有属主用户组为ydev的文件。 shell脚本编程学习笔记(一) 一、脚本格式 vim shell.sh #!/bin/bash//声明脚本解释器,这个‘#’号不是注释,其余是注释 #Program://程序内容说明 #History://时间和作者 二、shell变量的种类 用户自定义变量:由用户自己定义、修改和使用 与定义变量:Bash与定义的特殊变量,不能直接修改 位置变量:通过命令行给程序传递执行的参数 1、定义变量: 变量名要以英文字母或下划线开头,区分大小写。 格式:变量名=值 输出变量:echo $变量名 2、键盘输入为变量内容: 格式:read [-p "信息"] 变量名 如:read -p "pewase input your name:" name 3、不同引号对变量的作用 双引号"":可解析变量,$符号为变量前缀。 单引号'':不解析变量,$为普通字符。 反引号``:将命令执行的结果输出给变量。 三、shell条件测试 1、test命令: 用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其他数字。 格式:test 条件表达式[ 条件表达式] (注意:[]与表达式之间存在空格) 2、常见的测试类型: 测试文件状态 格式:[ 操作符文件或目录] 如:if [ -d /etc ] then echo "exists" else echo "not exists" fi 常见的测试操作符: -d:测试是否为目录 -e:测试目录或文件是否存在 -f:测试是否为文件 -r:测试当前用户是否有读权限 -w:测试当前用户是否有写权限 -x:测试当前用户是否有执行权限 shell心得体会 篇一:Linux心得体会 《Linux操作系统》学习心得体会 姓名:杜昕 学号:XX441789 班级:计科普1004班 一、摘要 Linux操作系统这个名词记得在很早以前就听过,但当时并不知道具体是什么样的操作系统,只知道是一个与嵌入式密切相关的操作系统。因为我是学习嵌入式方向的,这学期就选修了这门专业任选课。为了更好的学习这门课程,我不仅课上认真听讲,课下也努力学习,为此还在自己的电脑上安装了Ubuntu系统。眼看这个学期的Linux课程已经告一段落了,我觉得有必要写一遍心得体会来总结一下这学期对着门课程的学习。 关键词:Linux、嵌入式、心得 二、Linux简介 Linux是一种广泛使用的类UNIX操作系统,它不仅可以在Intel,AMD等系列个人计算机上运行,也可以运行在许多工作站上。它是真正多用户、多任务操作系统,他继承了UNIX系统的主要特征,具有强大的信息处理功能,特别在Internet和Intranet应用中占有明显优势。 1991年,芬兰赫尔辛基大学的学生Linux Torvalds在Inter386个人计算机上开发了Linux核心,并利用互联网发布了源代码,从而创建了Linux操作系统。之后,许多系统软件设计专家共同对它进行改进和提高。到现在为止,Linux 已成为具有全部UNIX特征、与POSIX兼容的操作系统。 Linux的功能强大而全面,与其他操作系统相比,具有一系列显著特点: (1)与UNIX系统兼容。 (2)自由软件和源码公开。 (3)性能高和安全性强。 (4)便于定制和再开发。 (5)互操作性高。 (6)全面的多任务和真正的32位操作系统。 当今的Linux有两种版本:核心版本和发行版本。其中核心版本主要是Linux的内核。其官方版本由Linux Torvalds本人维护着。发行版本是各个公司推出的版本,他们与核心版本是各自独立发展的。常见的发行版本有以下7种: (1)Red Hat Linux/ Fedora Core (2)Debian (3)Ubuntu (4)Slackware ==============================智能娱乐系统=================== 硬件:中控:UI,音视频数据处理能力 操作:显卡,声卡、LED、游戏机、触控屏 ARM :cortex - A 软件:开发环境:vmware + linux(ubuntu) 程序开发:linux C 程序移植:交叉开发 效果:自动处理程序 一、Linux 命令 linux : 图形简陋---> 追求效率高 移植性强,开源性 linux :命令行形式进行交互 ls: 查看全部文件名/ --->根目录 pwd: 打印当前的路径/home/gec 等于~ ---> 家目录 cd : 直接回到/home/gec cd / : 回到根目录/ cd ..: 回到上一级的目录 ls -l 类型权限链接数创建者工作组大小日期目录名d rwxrwxr-x 2 gec gec 4096 Jul 2 2013 Desktop d:目录(第一个字母:-:普通文件d:目录) rwxrwxr-x:文件的权限r:读权限w:写权限x:执行权限 用户权限:rwx(创建者的权限)rwx(同组人)r-x(其他人) clear: 清除屏幕信息 touch 创建文件 touch xxxx ----> 因为身份是gec,所以必须在/home/gec中创建 rm 删除文件/目录 rm xxxx(文件名) ----> 因为身份是gec,所以必须在/home/gec中删除rm xxxx(目录名) -rf gedit 编辑文件 gedit xxxx cat 查看文件内容 cat xxxx mkdir 创建目录 mkdir xxxx ----> 因为身份是gec,所以必须在/home/gec中创建 cp 拷贝命令 cp 文件名目录名---> cp abc.c 123/ chmod 修改文件的权限 -rw-rw-r-- 1 gec gec 20 Apr 14 19:43 abc.c 421421421 6 6 4 希望三个人都是可读可写可执行7 7 7 chmod 777 xxxx chmod 777 abc.c -rwxrwxrwx 1 gec gec 20 Apr 14 19:43 abc.c 二、linux与windows间的共享目录 1,在windows系统中的D:\创建一个名字为share的目录 2, "虚拟机" --- "设置" ---- "选项" --- "共享文件夹" --- "总是启用" ---"确定" 3,在linux系统输入以下命令来进入共享目录 cd /mnt/hgfs/share/ 4,在linux与windows分别创建目录和文件,观察两个系统的变化 =====================开发板的使用========================= 一、核心板 PowerShell基本语法及常用命令 Powershell常用命令 1.Get-Command 得到Powshell所有命令 2.Get-Process 获取所有进程 3.Set-Alias 给指定命令重命名如:Set-Alias aaa Get-Command 4.Set-ExecutionPolicy remotesigned 设置powershell可直接执行脚本文件一般脚本文件以.ps1结尾执行脚本文件直接输入文件地址即可执行脚本文件中只写命令即可 5.Get-Help get-* 查询以get开头的命令Get-Help *service* Get-Help Get-Command 获取Get-Command命令的基本用法 6.Get-Member 获取对象属性如: $var | Get-Memeber 访问$var属性直接$var.T oString() PS中的变量定义 不需要定义或声明数据类型 在变量前加"$" 定义变量的规则 -变量可以是数字$123 -变量可以是字符串$abc -变量可以是特殊字符${@1b} 内置的变量 -$pshome -$home -$profile 变量赋值: $var=123 $var="aaaaaa" 取变量值: $var 变量赋值方法:Set-Variable var 100 取值方法: Get-Variable var 清空值: Clear-Variable var 删除变量Remove-Variable var 取多个变量如var1 var2 var3地值: Get-Variable var* 另一种赋值方法$var1="bbb" $var2="$var $var1" 结果$var2="aaaaaa bbb" $var2='$var $var1' 结果$var2="$var $var1" $date=Get-Date 获取当前时间 $date.AddDays(3) 当前时间加3天 排序用法 Get-Process | Sort-Object ws 根据WS值由小到大排序 Get-Process | Sort-Object | fl Get-Process | Sort-Object | Format-List 以列表形式显示数据 导入导出文件 Get-Process > c:\aa.txt 第十二章学习shell脚本之前的基础知识 日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写shell脚本,那么你就不算一个合格的管理员。目前很多单位在招聘linux系统管理员时,shell脚本的编写是必考的项目。有的单位甚至用shell脚本的编写能力来衡量这个linux系统管理员的经验是否丰富。笔者讲这些的目的只有一个,那就是让你认真对待shell脚本,从一开始就要把基础知识掌握牢固,然后要不断的练习,只要你shell脚本写的好,相信你的linux求职路就会轻松的多。笔者在这一章中并不会多么详细的介绍shell脚本,而只是带你进入shell脚本的世界,如果你很感兴趣那么请到网上下载相关的资料或者到书店购买相关书籍吧。 在学习shell 脚本之前,需要你了解很多关于shell的知识,这些知识是编写shell脚本的基础,所以希望你能够熟练的掌握。 【什么是shell】 简单点理解,就是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具。实际上,在shell和计算机硬件之间还有一层东西那就是系统内核了。打个比方,如果把计算机硬件比作一个人的躯体,而系统内核则是人的大脑,至于shell,把它比作人的五官似乎更加贴切些。回到计算机上来,用户直接面对的不是计算机硬件而是shell,用户把指令告诉shell,然后shell再传输给系统内核,接着内核再去支配计算机硬件去执行各种操作。 笔者接触的linux发布版本(Redhat/CentOS)系统默认安装的shell叫做bash,即Bourne Again Shell,它是sh(Bourne Shell)的增强版本。Bourn Shell 是最早行起来的一个shell,创始人叫Steven Bourne,为了纪念他所以叫做Bourn Shell,检称sh。那么这个bash有什么特点呢? 1)记录命令历史 我们敲过的命令,linux是会有记录的,预设可以记录1000条历史命令。这些命令保存在用户的家目录中的.bash_history文件中。有一点需要你知道的是,只有当用户正常退出当前shell时,在当前shell中运行的命令才会保存至.bash_history文件中。 与命令历史有关的有一个有意思的字符那就是”!”了。常用的有这么几个应用:(1)!! (连续两个”!”),表示执行上一条指令;(2)!n(这里的n是数字),表示执行命令历史中第n条指令,例如”!100”表示执行命令历史中第100个命令;(3)!字符串(字符串大于等于1),例如!ta,表示执行命令历史中最近一次以ta为开头的指令。 linux Shell(脚本)编程入门实例讲解详解 为什么要进行shell编程 在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具。Shell不仅仅是命令的收集,而且是一门非常棒的编程语言。您可以通过使用shell使大量的任务自动化,shell特别擅长系统管理任务,尤其适合那些易用性、可维护性和便携性比效率更重要的任务。 下面,让我们一起来看看shell是如何工作的: 建立一个脚本 Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行shell编程,因为bash是免费的并且很容易使用。所以在本文中笔者所提供的脚本都是使用bash(但是在大多数情况下,这些脚本同样可以在bash 的大姐,bourne shell中运行)。 如同其他语言一样,通过我们使用任意一种文字编辑器,比如nedit、kedit、emacs、vi等来编写我们的shell程序。程序必须以下面的行开始(必须方在文件的第一行): 符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。当编辑好脚本时,如果要执行该脚本,还必须使其可执行。 要使脚本可执行: 然后,您可以通过输入: ./filename 来执行您的脚本。 注释 在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。我们真诚地建议您在程序中使用注释。如果您使用了注释,那么即使相当长的时间内没有使用该脚本,您也能在很短的时间内明白该脚本的作用及工作原理。 变量 在其他编程语言中您必须使用变量。在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写: 目录 一、目录操作 a) ls--查看文件/目录: 常用:ls –l 查看详细文件列表 b) pwd--查看当前目录: c) cd--改变工作目录: 常用①:cd ../ 跳转到上一级目录 常用②:cd /boot/ 跳转到指定目录 d) mkdir--创建目录: 常用:mkdir 123 创建一个空文件夹 e) rm--删除文件/目录: 常用: rm -rf 123 删除目录文件夹,并且目录下的文件一并删除。 f) mv--移动文件/目录改名、移动: 移动文件: mv 1.sh ./123 → mv 目标文件移动至某目录 重名命文件:mv 1.sh 123.sh → mv 原文件欲改后文件 g) ln--建立软连接和硬连接: 软连接:ln -s 123.sh ../ → ln -s 源文件欲放置路径 硬连接:ln 123.sh ../ → ln 源文件欲放置路径 h) rmdir--删除空目录: 二、文件操作 a)cat--查看文件内容,若文件不存在,创建对应文件: 常用:cat 1.txt b)cp--拷贝文件、目录: 备份:cp 123.sh 1.sh → cp 源文件目标文件 复制至某路径:cp 123.sh ../ → cp 源文件目标路径 c)chmod--修改文件权限: 常用:chmod 777 1.sh 给1.sh最高权限 一般模式:chmod +rw 1.sh 仅当前用户下1.sh具有可读写权限 d)touch--创建文件: 常用:touch ./1.sh → touch 路径+名称 f)vim--创建并打开文件: 常用:vim ./1.sh → vim 路径+名称 g)find--在指定目录查找符合条件的文件: 以[文件名+类型]寻找:find ./ -name “*.*”→ find 路径 -namaShell命令
linux+shell脚本语言基础知识
ubuntu shell 使用命令大全
shell 脚本入门笔记
Shell脚本编写基础
Linux 操作系统shell学习笔记 (linux系统)
一篇非常好的linux学习笔记分享(Linux入门绝佳)
很实用的Shell脚本(实践版)
Shell脚本编程详解-吐血共享
PCATTCP学习笔记
Linux Shell常用命令总结
个人整理shell脚本编程笔记
shell心得体会
linux系统学习笔记
PowerShell基本语法及常用命令
shell脚本之前的基础知识
linux Shell(脚本)编程入门 实例讲解详解
shell常用命令