shell学习笔记

info常用命令

敲?键或BACKSPACE,显示info的命令列表。
在帮助窗口中:
Ctrl-x 0 关闭帮助窗口
n键:显示(相对于本节点的)下一节点的文档内容
p键:显示(相对于本节点的)前一节点的文档内容
u键:进入上一层节点
m键:进入菜单项
g键:敲G键后输入主题名称,进入该主题
l键:回到上一个访问的页面
space键:向前滚动一页
del键:向后滚动一页
q:退出info
b 或 t 或 Home 文档的开始(b 是 begining 的意思)
e 或 End 文档的末尾(b 是 ending 的意思)
Ctrl-l 刷新当前页,若当前文档显示情况有问题时

shell常用命令

whatis command 查找与command完全匹配的指令
apropos command 查找与command近似的指令
source ~/.bashrc 重新读取设定档参数
history 查看历史敲入的指令
!number 执行历史第number号指令
!command 执行最近以command开头的指令
!! 执行上一个指令
alias h=’history’ 为history命令设置别名h,可以直接使用h代替history
alias 查看已有哪些命令别名
unalias h 取消命令别名

工作管理job control:当我们登入系统取得bash shell之后,在单一终端界面下同时进行多个工作的行为管理。
command & 直接将指令丢到背景中执行
ctrl+z 将当前工作丢到背景中,当前工作变为stopping状态
bg %jobnumber 让背景中第jobnumber号工作变成running状态
jobs 观察目前背景的工作状态
fg %jobnumber 将jobnumber号背景工作拿到前景处理
kill -9 %jobnumber 移除背景中jobnumber号工作
nohup ./sleep500.sh & 离线运行job。默认放在背景中的工作,与当前终端关联,当退出终端,工作中断。可以使用nohup指令,将工作放在系统背景中执行,离线后任务仍能运行。注意nohup不支持bash内建命令。

查看系统有多少sh

chsh -l

元字符

空格, ‘|’, ‘&’, ‘;’, ‘(’, ‘)’, ‘<’, or ‘>’
注:元字符在shell中用于分割单词,每一个元字符对于shell都有特殊含义,如果想要代表自身,必须使用被引用。

操作符

shell操作符分为控制操作符和重定向操作符。操作符至少会包含一个未引用元字符

控制操作符

newline 或者 ‘||’, ‘&&’, ‘&’, ‘;’, ‘;;’, ‘|’, ‘|&’, ‘(’, or ‘)’
注:‘|&’管道命令将上一个命令的标准错误输出连接到下一个命令的标准输入,是命令“2>&1 |”快捷方式。

重定向操作符

‘>’, ‘<’, ‘>>’, ‘<<’, ‘&>’, ‘&>>’

引用语法

引用(Quoting):用于移除字符、符号对shell的特殊含义。引用有4种方法:

转义字符

除newline(即\n字符)外,转义符号‘\’可以保留下一个字符的字面值。\newline表示行继续。

单引号引用

单引号引用(Single Quotes):保留它引用的所有字符的字面值,包括转义符号。因此,单引号不能出现在单引号引用中。

双引号引用
双引号引用(Double Quotes):保留除'$'、'`'、'\'和'!'外所有其它字符的字面值。其中‘$’、‘`’会保留其特殊含义。‘\’只有后跟‘$’, ‘`’, ‘"’, ‘\’, or newline字符时才起转义作用,否则‘\’保留字面值。‘\’后跟‘!’也会起到转义作用,取消histroy expansion,但处理时,‘\’保留。
注:‘*’、‘@’字符在双引号引用时具有特殊含义。
C样式引用

C样式引用(ANSI-C Quoting): 用于将\t等blakslash-escaped字符替换成ANSI C标准规定的字符。扩展后的结果为单引号引用,仿佛$符号不存在。
语法:$’string\tstring’

Locale-Specific Translation

语法:$”string”,用于根据本地环境翻译字符串。如果locale为C或POSIX,则忽略$符号。如果string被转换,则转换结果为双引号引用。具体用法不详。

注释

用‘#’开头注释一行。

shell命令

简单命令

简单命令(Simple Command):是由一串用blanks(blank包括空格和tab字符)分隔、以控制操作符结尾(不包括该控制符)的单词组成。第一个单词为执行的命令,其它为命令参数。

管线命令

管线命令(Pipeline):是由一串用‘|’或‘|&’分隔的简单命令组成。

命令列表

命令列表(List of Commands):是由一串用‘&’或‘;’或‘&&’或‘||’分隔的管线命令组成,后面可选使用‘&’或‘;’或‘newline’字符终结。
command &: 表示在背景中执行该命令;
command1; command2:表示顺序执行命令command1、command2;
command1 && command2:表示command1命令执行成功后,才执行command2;
command1 || command2:表示只有在command1命令执行失败,才执行command2。
&& || 都为左结合。

复合命令
循环

下面命令格式中的‘;’可以被一个或多个‘newline’代替
until:until test-commands; do consequent-commands; done
# 只要test-commands返回值非0,consequent-commands就会一直执行下去。整个语句的返回值是consequent-commands最后一个命令返回状态或者如果没有执行,则返回0。
while: while test-commands; do consequent-commands; done
# 只要test-commands返回值为0,consequent-commands就会一直执行下去。返回值取值方式与until相同。注:[ relational expr ]在expr为真时,返回0;为假时,返回1。
for: for (( expr1; expr2; expr3 )); do commands; done
# 与c语言for用法相同。整个语句返回值为commands最后一个命令返回状态或者如果任何一个expr无效,则返回false
for name [ [ in [words …] ]; ] do commands; done
# 其中[]表示可选项。如果in words不存在,则默认为in “$@”。返回值取值方式与while相同。
其中,break和continue可以在循环结构中使用。

条件

if:if test-commands; then consequent-commands; [ elif more-test-commands; then more-consequents; ] [ else alternate-consequents; ] fi
# 返回值为最后一条执行命令的返回状态或者如果没有一条为真,则返回0
case:case word in [ [(] pattern [| pattern] …) command-list;; ]… esac
# 返回值的取值方式与if相同
select:select name [ in words… ]; do commands; done
# 与for的用法类似,用于生成一个可供用户选择的菜单。
(( … )):(( expression ))
# 算术表达式求值。如果表达式值非0,返回0;否则返回1。
[[ … ]]:[[ expression ]]
# 条件表达式求值。如果条件表达式为真,返回0;否则返回1。条件表达式中如果使用==或!=, 则右边的字符串作为Pattern Matching进行匹配。Pattern Matching语法为:
* 匹配任意长度字符串;?匹配单个任意字符;[..] 匹配括号中的任意一个字符。
使用=~,与==和!=有相同优先级,其右边的字符串将作为正则表达式进行匹配。

分组命令

有2种命令分组方式,分别为:(list), { list; }。其中
(list):list中命令会在创建的subshell环境中执行。因此在list中变量赋值在subshell执行结束后不再有效。由于‘(’、‘)’为操作符,可以与list之间不用空格,也能被shell认作单独的token。
{ list; }:list中的命令会在当前shell环境中执行。‘;’或newline必须跟在list后面。由于‘{’为保留字,因此list与‘{’之间必须用空格隔开。

shell参数

参数分为:位置参数、特殊参数(由特殊字符表示的参数)和变量三种。其中变量包含值和0到多个属性,其属性由declare进行声明。

位置参数

位置参数(Positional parameters):是调用shell时给定的参数,通过 N N方式进行引用,其中N为非0的数字。如果N超过的1位数字,则必须使用${N}方式引用。
位置参数不能使用赋值语句进行赋值,但可以使用set或shift进行设置。当执行shell函数时,位置参数会被临时替换。

特殊参数
特殊参数(Special parameters):下面这些字符作为shell的特殊参数,只能被引用,不能赋值。
*:指代所有位置参数,中间使用IFS变量进行分割。即"$*"等价于"$1c$2c…",其中c为IFS变量。
@:指代所有位置参数,但扩展方式与*不同。"$@"等价于"$1" "$2" …;"w$@w"等价于"w$1" "$Nw"。其中N为最后一个位置参数序号。
#:指代位置参数个数。
?:上一个前景命令返回状态。
-:指代当前shell调用时option 选项。option选项由set设置或-i选项。
$:指代shell的进程id。在()subshell中,$指代调用shell的进程id,而不是subshell的进程id。
!:指代最近执行的后台命令进程id。
0:指代shell脚本名。
_:shell启动时,指代脚本执行的绝对路径。随后,指代上一个命令的最后一个参数。

shell扩展

扩展顺序依次为:{}扩展、~扩展、参数扩展、算术扩展、命令替换、单词分割、文件名扩展。
只有{}扩展、单词分割和文件名扩展能改变单词个数,其它扩展都是将一个单词替换为另一个单词。

{}扩展

有2种使用样式:
[ preamble ]{word1,word2 [,word3]…} [ postscript ]:扩展为preambleword1postscript preambleword2postscript …
{x..y[..inc]}:扩展为[x,y]之间的所有整数或字符。其中inc为增量,整数,默认为1或-1。x、y类型需相同,为整数或单个字符。如果为整数时,x、y前面可加数字0,用于强制所有字符具有相同宽度。

~扩展
~      $HOME
~/foo  $HOME/foo
~fred/foo      用户fred家目录下的foo目录
~+/foo $PWD/foo
~-/foo $OLDPWD/foo
~N     dirs +N。dirs显示当前记住的路径列表,+N表示从左边数,输出第n个路径,起始位置从0开始。
~+N        dirs +N。
~-N        dirs -N。输出从右边数,第n个路径,起始位置从0开始。
参数扩展
${parameter}: 在一般情况下{}可省略,除了参数是超过1个数字的位置参数,或者参数包含的字符可能不能正确被shell解释。
${parameter:-word}: 如果参数为空,则扩展为word,如果非空,则扩展参数值。
${parameter:=word}:如果参数为空,则parameter先被赋值为word,再扩展为参数值;否则扩展为参数值。位置参数和特殊参数不能使用这种方式。
${parameter:?word}: 如果参数为空,则word会被输出到错误输出,并且退出非交互式shell。否则扩展为参数值。
${parameter:+word}:如果参数为空,nothing happen。否则扩展为word。
${parameter:offset}
${parameter:offset:length}:扩展为参数值的子字符串,子字符串由offset偏移量和length指定,如果length忽略,则为offset开始的子字符串。
算术扩展
$(( expression )):扩展为表达式的计算结果。
命令替换
$(commad)
`command`:扩展为命令的输出结果。
进程替换(process substitution)

(list)
<(list):扩展为进程list输入或输出文件名或者命名管道。注意:>或<与(之间没有空格。

单词分割

shell将会对未包含在双引号引用的参数扩展、算术扩展、命令替换的结果进行单词分割。单词分割符有变量IFS控制,默认以、、作为分隔符,扩展结果的头部和尾部的分隔符都会被删除。如果IFS被设置为NULL,单词分割不会发生。
单词分割时,显式的null参数如””、’’会被保留。未被引用的由扩展产生的隐式null参数,将会被移除。被双引号引用的隐式null参数则会被保留。
注意:如果没有扩展发生,单词分割也不会进行。

文件名扩展

在单词分割后,如果-f选项没有设置,shell将会搜索每个单词是否包含*、?、[字符,对文件名进行通配。包含这些字符的单词将作为一个文件名匹配模式,被替换为以字母顺序排列的与模式匹配的文件名。

命令重导向

標準輸入;代碼為 0 ;或稱為 stdin ;使用的方式為 < 
標準輸出:代碼為 1 ;或稱為 stdout;使用的方式為 1> 
錯誤輸出:代碼為 2 ;或稱為 stderr;使用的方式為 2> 
<  :由 < 的右邊讀入參數檔案; 
>  :將原本由螢幕輸出的正確資料輸出到 > 右邊的 file ( 檔案名稱 ) 或 device ( 裝置,如 printer )去; 
>> :將原本由螢幕輸出的正確資料輸出到 >> 右邊,與 > 不同的是,該檔案將不會被覆蓋,而新的資料將以『增加的方式』增加到該檔案的最後面; 
2> :將原本應該由螢幕輸出的錯誤資料輸出到 2> 的右邊去。 
/dev/null :可以說成是黑洞裝置!
2>&1:將正確與錯誤資料通通寫入同一個檔案
[dmtsai@www ~]$ find /home -name .bashrc > list 2>&1     <==正確
[dmtsai@www ~]$ find /home -name .bashrc &> list         <==正確

主机名与地址查找

查找对方主机名
host ip
nslookup ip
获取对方ip地址
ping

删除包含特殊起始字符的文件

rm – ! # – 表示命令选项已经结束,后面都是参数

ssh使用

非交互的ssh密码验证

Usage: sshpass [-f|-d|-p|-e] [-hV] command parameters
-f filename Take password to use from file
-d number Use number as file descriptor for getting password
-p password Provide password as argument (security unwise)
-e Password is passed as env-var “SSHPASS”
With no parameters - password will be taken from stdin

-h Show help (this screen)
-V Print version information
At most one of -f, -d, -p or -e should be used

$> sshpass -p user_password ssh user_name@192.168..1.2
$> sshpass -p user_password scp -P22 192.168.1.2:/home/test/t . 
ubuntu使用ssh登录太慢

修改/etc/ssh/ssh_config中GSSAPIAuthentication选项,由yes变为no
sudo restart ssh

抑制Are you sure you want to continue connecting输出

ssh -o “StrictHostKeyChecking no” $host “cd /home/work/databus/relay/task && grep tag_name *.task”

ssh执行远程命令无法结束返回

ssh user@host “/script/to/run < /dev/null > /tmp/mylogfile 2>&1 &”
问题解释:
SSH connects stdin, stdout and stderr of the remote shell to your local terminal, so you can interact with the command that’s running on the remote side.

As a side effect, it will keep running until these connections have been closed, which happens only when the remote command and all its children (!) have terminated (because the children, which is what “&” starts, inherit std* from their parent process and keep it open).

So you need to use something like

ssh user@host “/script/to/run < /dev/null > /tmp/mylogfile 2>&1 &”
The <, > and 2>&1 redirect stdin/stdout/stderr away from your terminal. The “&” then makes your script go to the background. In production you would of course redirect stdin/err to a suitable logfile.

pipe to shell脚本

cat > foo.txt
使用cat工具,中继标准输入。

函数返回字符串

function myfunc()
{
    local  __resultvar=$1
    local  myresult='some value'
    if [[ "$__resultvar" ]]; then
        eval $__resultvar="'$myresult'" 或者 export $__resultvar=”$myresultelse
        echo "$myresult"
    fi
}

myfunc result
echo $result
result2=$(myfunc)
echo $result2

输出大段字符串

使用here document语法,如下:

cat <<EOF
Hello World
Jim, Tom
EOF

在线清空文件

> file  自动清空当前文件

操作字符串

字符串长度
${#string}
expr length $string
expr $string : ‘.*’
字符串查找
expr index $string $substring       返回匹配字符串的第一个字符的索引。索引从1开始
字符串提取
${string:position}             提取position到末尾的子字符串。
${string:position:length}      
expr substr $string $position $length 从position提取length长度的子字符串
expr match "$string" '\($substring\)'  
expr "$string" : '\($substring\)'        提取开头处子字符串
expr match "$string" '.*\($substring\)'  
expr "$string" : '.*\($substring\)'        提取末尾处的子字符串
字符串删除
${string#substring}        删除开头处的最短子字符串
${string##substring}   删除开头处的最长子字符串
${string%substring}    删除末尾处的最短子字符串
${string%%substring}   删除末尾处的最长子字符串

22.5 字符串替换

${string/substring/replacement}    替换第一个查找到子字符串
${string//substring/replacement}   替换所有查找到的子字符串
${string/#substring/replacement}   替换开头处的子字符串
${string/%substring/replacement}   替换结尾处的子字符串

22.6 切分字符串
切分字符串为数组:

# init all your individual arrays here
imageId=(); sessionId=();

while IFS=, read -ra arr; do
    imageId+=(${arr[0]})
    sessionId+=(${arr[1]})
done < input.csv

# Print your arrays
echo "${imageId[@]}"
echo "${sessionId[@]}"

切分字符串作为不同变量

$ IFS=- read var1 var2 <<< ABCDE-123456
$ echo "$var1"
ABCDE
$ echo "$var2"
123456

原地输出进度条

echo -ne '#####                     (33%)\r'
sleep 1
echo -ne '#############             (66%)\r'
sleep 1
echo -ne '#######################   (100%)\r'
echo -ne '\n'

以上命令必须放在脚本中一起运行。
24 输出带颜色的字体
shell脚本中echo显示内容带颜色显示,echo显示带颜色,需要使用参数-e
格式如下:

echo -e “\033[字背景颜色;文字颜色m字符串\033[0m”
例如:

echo -e “\033[41;36m something here \033[0m”
其中41的位置代表底色, 36的位置是代表字的颜色
注:
  1、字背景颜色和文字颜色之间是英文的”;”
  2、文字颜色后面有个m
  3、字符串前后可以没有空格,如果有的话,输出也是同样有空格
  下面是相应的字和背景颜色,可以自己来尝试找出不同颜色搭配

echo -e “\033[31m 红色字 \033[0m”
echo -e “\033[34m 黄色字 \033[0m”
echo -e “\033[41;33m 红底黄字 \033[0m”
echo -e “\033[41;37m 红底白字 \033[0m”
字颜色:30—–37
  echo -e “\033[30m 黑色字 \033[0m”
  echo -e “\033[31m 红色字 \033[0m”
  echo -e “\033[32m 绿色字 \033[0m”
  echo -e “\033[33m 黄色字 \033[0m”
  echo -e “\033[34m 蓝色字 \033[0m”
  echo -e “\033[35m 紫色字 \033[0m”
  echo -e “\033[36m 天蓝字 \033[0m”
  echo -e “\033[37m 白色字 \033[0m”
字背景颜色范围:40—–47
  echo -e “\033[40;37m 黑底白字 \033[0m”
  echo -e “\033[41;37m 红底白字 \033[0m”
  echo -e “\033[42;37m 绿底白字 \033[0m”
  echo -e “\033[43;37m 黄底白字 \033[0m”
  echo -e “\033[44;37m 蓝底白字 \033[0m”
  echo -e “\033[45;37m 紫底白字 \033[0m”
  echo -e “\033[46;37m 天蓝底白字 \033[0m”
  echo -e “\033[47;30m 白底黑字 \033[0m”
最后面控制选项说明
  \33[0m 关闭所有属性
  \33[1m 设置高亮度
  \33[4m 下划线
  \33[5m 闪烁
  \33[7m 反显
  \33[8m 消隐
  \33[30m — \33[37m 设置前景色
  \33[40m — \33[47m 设置背景色
  \33[nA 光标上移n行
  \33[nB 光标下移n行
  \33[nC 光标右移n列
  \33[nD 光标左移n列
  \33[y;xH设置光标位置
  \33[2J 清屏
  \33[K 清除从光标到行尾的内容
  \33[s 保存光标位置
  \33[u 恢复光标位置
  \33[?25l 隐藏光标
  \33[?25h 显示光标

shell脚本编写

变量声明

variable=value 其中=与variable必须没有空格。
变量默认当做字符串对待。字符串之间直接可以使用引号连接。
使用declare声明变数变量

声明数组变量(shell支持一维索引数组和相关数组):
对于索引数组,可以自动创建:
name[subscript]=value subscript将会作为算术表达式
也可以显式声明:
declare -a name
对于相关数组,需要显式声明:
declare -A name
数组可以使用以下语法进行赋值:
name=(value1 … valuen)

变量引用

变量引用1
变量引用2
变量引用3

变量作用域

Shell脚本中定义的变量是global的,其作用域从被定义的地方开始,到shell结束或被显示删除的地方为止。
Shell函数定义的变量默认是global的,其作用域从“函数被调用时执行变量定义的地方”开始,到shell结束或被显示删除处为止。函数定义的变量可以被显示定义成local的,其作用域局限于函数内。但请注意,函数的参数是local的。
如果同名,Shell函数定义的local变量会屏蔽脚本定义的global变量。

if条件判断

if条件判断
1. 在 [ ] 當中,只能有一個判別式;
2. 在 [ ] 與 [ ] 當中,可以使用 && 或 || 來組織判別式;
3. if条件判断语句需要使用;号结束
4. 每一個獨立的元件之間『都需要有空白鍵來隔開』!

邏輯標籤表示意思
關於檔案與目錄的偵測邏輯標籤!
-f常用!偵測『檔案』是否存在,如if [ ! -f $mypath ]; then
-d常用!偵測『目錄』是否存在
-b偵測是否為一個『 block 檔案』
-c偵測是否為一個『 character 檔案』
-S偵測是否為一個『 socket 標籤檔案』
-L偵測是否為一個『 symbolic link 的檔案』
-e偵測『某個東西』是否存在!
關於程序的邏輯標籤!
-G偵測是否由 GID 所執行的程序所擁有
-O偵測是否由 UID 所執行的程序所擁有
-p偵測是否為程序間傳送資訊的 name pipe 或是 FIFO (老實說,這個不太懂!)
關於檔案的屬性偵測!
-r偵測是否為可讀的屬性
-w偵測是否為可以寫入的屬性
-x偵測是否為可執行的屬性
-s偵測是否為『非空白檔案』
-u偵測是否具有『 SUID 』的屬性
-g偵測是否具有『 SGID 』的屬性
-k偵測是否具有『 sticky bit 』的屬性
兩個檔案之間的判斷與比較 ;例如『 test file1 -nt file2 』
-nt第一個檔案比第二個檔案新
-ot第一個檔案比第二個檔案舊
-ef第一個檔案與第二個檔案為同一個檔案( link 之類的檔案)
邏輯的『和(and)』『或(or)』
&&邏輯的 AND 的意思
||邏輯的 OR 的意思
字符串空值比较
-z字符串为”null”.就是长度为0.
-n字符串不为”null”
冒号空操作符

‘:’ 冒号可以作为空操作符

整数比较
-eq       等于,如:if [ "$a" -eq "$b" ] 
-ne       不等于,如:if [ "$a" -ne "$b" ] 
-gt       大于,如:if [ "$a" -gt "$b" ] 
-ge       大于等于,如:if [ "$a" -ge "$b" ] 
-lt       小于,如:if [ "$a" -lt "$b" ] 
-le       小于等于,如:if [ "$a" -le "$b" ] 
<       小于(需要双括号),如:(("$a" < "$b")) 
<=       小于等于(需要双括号),如:(("$a" <= "$b")) 
>       大于(需要双括号),如:(("$a" > "$b")) 
>=       大于等于(需要双括号),如:(("$a" >= "$b")) 
字符串比较
=       等于,如:if [ "$a" = "$b" ] 
==       等于,如:if [ "$a" == "$b" ],与=等价 
       注意:==的功能在[[]]和[]中的行为是不同的,如下: 
       1 [[ $a == z* ]]    # 如果$a以"z"开头(模式匹配)那么将为true 
       2 [[ $a == "z*" ]] # 如果$a等于z*(字符匹配),那么结果为true 
       3 
       4 [ $a == z* ]      # File globbing 和word splitting将会发生 
       5 [ "$a" == "z*" ] # 如果$a等于z*(字符匹配),那么结果为true 
       一点解释,关于File globbing是一种关于文件的速记法,比如"*.c"就是,再如~也是. 
       但是file globbing并不是严格的正则表达式,虽然绝大多数情况下结构比较像. 
!=       不等于,如:if [ "$a" != "$b" ] 
       这个操作符将在[[]]结构中使用模式匹配. 
<       小于,在ASCII字母顺序下.如: 
       if [[ "$a" < "$b" ]] 
       if [ "$a" \&amp;amp;amp;lt; "$b" ] 
       注意:在[]结构中"<"需要被转义. 
>       大于,在ASCII字母顺序下.如: 
       if [[ "$a" > "$b" ]] 
       if [ "$a" \> "$b" ] 
       注意:在[]结构中">"需要被转义. 
       具体参考Example 26-11来查看这个操作符应用的例子. 
-z       字符串为"null".就是长度为0. 
-n       字符串不为"null" 
正则比较

=~ 右边操作数被视为正则表达式,如果左边的操作数匹配该正则表达式,返回真,否则返回假。

[[ name =~ work ]]
引用脚本运行参数

引用脚本运行参数
$? 引用上一个命令运行返回参数

命令行选项
while getopts “t:d:b” arg
do
    case $arg in
        t)
            case $OPTARG in
                0)
                    ;;
                ?)
                    ;;
            esac
            ;;
        d)
            ;;
        ?)
            ;;
    esac
done

命令行编辑

C-b:向后移动一个字符
C-f:向前移动一个字符
C-d:删除光标下的字符
C-_
C-x
C-u: 取消上次编辑
C-a: 移动到行开头
C-e: 移动到行结尾
M-f:向前移动一个单词,单词由字母和数字组成。M代表左边的Alt键
M-b:向后移动一个单词
C-l:清除屏幕,当前行处于屏幕顶端
C-k:剪切光标到行尾的文本
C-y:粘贴所有剪切的文本
C-r:在history中向后搜索命令
C-s:在history中向前搜索命令
Esc:停止增量搜索

只列出所有目录

find . -type d

查看非打印字符

sed -n l

非本路径压缩

tar -zcvf /tar_path/tar_name tar_file …

远程拷贝

多个路径拷贝
scp -r {bin,conf,task} user@host:path

按行遍历文件

while read line; do … done < file

输入TAB字符

readline提供以下快捷键输入TAB字符
ctrl+v TAB键
或者使用 $’\t’,不能再使用单引号或双引号引用。

数组

shell提供2种数组:indexed array索引数组和associated array相关数组。数组无大小限制。数组元素可以是不同类型。通过declare声明属性,可以保证所有元素属性相同。

数组声明

索引数组:
显式声明:declare -a name 或者declare -a name[subscript]。其中subscript将被忽略
隐式声明:name[subscript]=value。subscript将被视为算术表达式。
相关数组:
必须显式声明:declare -A name

数组赋值

name=(value1 value2 … valuen),其中value的格式为[subscript]=string。对于索引数组[subscript]=可以省略不写,默认从当前下一个索引开始。相关数组必须使用subscript。索引从0开始。
对单个元素赋值,可使用:name[subscript]=value。
扩展数组元素,可使用:name+=(value)

数组引用

${name[subscript]}
如果subscript为@或*,将扩展为数组所有成员。

数组长度

${#array[@]}

数组索引

${!array[@]}

删除数组

unset name[subscript] 删除subscript指定的元素
unset name或unset name[@]或unset name[*] 删除整个数组
注意使用unset删除元素时,其索引值不会变。包括索引数组。

数组循环
# declare an array variable
declare -a arr=("element1" "element2" "element3")

# now loop through the above array
for i in ${arr[@]}
do
   echo "$i"
   # or do whatever with individual element of the array
done

# You can access them using echo "${arr[0]}", "${arr[1]}" also

找回上次svn commit提交失败所写的log

:r /tmp/svn-commit.1.tmp

bash间共享命令历史记录

文件访问时间、修改时间和状态改动时间

1、 访问时间(access time),读一次这个文件的内容,这个时间就会更新。比如对这个文件运用 more、cat等命令。ls、stat命令都不会修改文件的访问时间。
2、修改时间(modify time),修改时间是文件内容最后一次被修改时间。比如:vi后保存文件。ls -l列出的时间就是这个时间。
3、状态改动时间(change time)。是该文件的i节点最后一次被修改的时间,通过chmod、chown命令修改一次文件属性,这个时间就会更新。

删除^M特殊字符

sed s/^M//g -i file # 其中^M字符,需要使用Ctrl+V Ctrl+M进行输入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值