2021-01-06
- 計(jì)算向腳本傳遞的參數(shù)個(gè)數(shù)
$#
- 在腳本中獲取腳本的名稱
$0
- 檢查上一條命令是否執(zhí)行成功
$? # 值為0說(shuō)明執(zhí)行成功,非0則執(zhí)行失敗
- 獲取文件最后一行
tail -1 # tail 為顯示最后10行
- 獲取文件第一行
head -1 # head 為顯示前10行
- 向腳本傳遞參數(shù)
./test.sh file.txt
cat test.sh
#!/bin/bash
echo $1
######
輸出為:file.txt
- 在腳本中使用傳進(jìn)來(lái)的參數(shù)
bash copy.sh file.txt /home/
cat copy.sh
#!/bin/bash
cp $1 $2
- 獲取一個(gè)文件每一行的第三個(gè)元素
awk { print $3 } # -F" " 指定分隔符,不寫(xiě)-F的時(shí)候默認(rèn)分隔符為空格
- 找出以“FIRST”開(kāi)頭的行,并獲取這些行的第四個(gè)元素
awk { if ( $1 == "FIRST") print $4 } #注意{}前后有空格,在命令行使用if時(shí)用(),在腳本中用[]
- 調(diào)試腳本的方式
# 在解釋器后面加 -xv
cat test.sh
#!/bin/bash -xv
- 定義函數(shù),并調(diào)用函數(shù)
cat aa.sh
#!/bin/bash
function test {
echo "The first func!"
}
test
######
輸出結(jié)果為:The first func!
- 連接兩個(gè)字符串
# 變量在賦值時(shí),等號(hào)左右兩邊不能有空格,與python的格式有區(qū)別
a='haha '
b='kk'
c=$a$b
echo $c
######
輸出結(jié)果為:haha kk
- 兩數(shù)相加
a=5
b=6
法1:let c=$a+$b
echo $c
法2:echo $[$a+$b] (常用)
######
輸出結(jié)果為:11
- 檢查文件系統(tǒng)是否存在某個(gè)文件
if [ -f /var/log/messages ]
then
echo "file exists"
fi
######
輸出結(jié)果為:file exists
- for循環(huán)語(yǔ)法
for i in $(ls);
do
echo "item:$i"
done
例子:循環(huán)輸出1到10
法1:
for j in {1..10};
do
echo $j
done
法2:
for k in `seq 1 10`;
do
echo $k
done
# seq 產(chǎn)生指定兩個(gè)數(shù)之間的所有整數(shù),默認(rèn)間隔為1
seq -5 2 5 # 換行輸出-5 到 5 之間的整數(shù),間隔為2
- while循環(huán)語(yǔ)法
#!/bin/bash
a=0
while [ $a -lt 10 ];
do
a=$[ $a+1 ]
echo $a
done
# a 的值小于10就+1,并打印+1之后a的值
- until循環(huán)語(yǔ)法
# until與while相反,當(dāng)滿足條件時(shí)停止循環(huán),不滿足條件則執(zhí)行循環(huán)
#!/bin/bash
a=10
until [ $a -lt 5 ];
do
let a-=1
echo $a
done
- 常用解釋器
#!/bin/bash
#!/usr/bin/python
- 獲取文件第10行
head -10 file | tail -1
- bash 腳本文件的第一個(gè)符號(hào)是什么
# - 命令
[ -z "" ] && echo 0 || echo 1的解釋和輸出是什么
[-z ''''] 的長(zhǎng)度為零則為真,&& 如果符號(hào)前面結(jié)果為真,就執(zhí)行符號(hào)后面的命令,反之不執(zhí)行,|| 如果符號(hào)前面的結(jié)果為真,就不執(zhí)行后面的命令,反之則執(zhí)行后面的命令,因此輸出為 0
- 命令 “export” 有什么用 ?
使變量在子shell中可用
- 在后臺(tái)運(yùn)行腳本
(1)在腳本后面加 $
(2)nohup command&
- chmod 500 test.sh 有什么用
使test.sh 的所有者擁有讀權(quán)限和執(zhí)行權(quán)限
- ">" 作用
重定向輸出流到文件或另一個(gè)流
- & 與 && 的區(qū)別
&:使腳本在后臺(tái)運(yùn)行
&&:符號(hào)前一個(gè)命令執(zhí)行成功,則執(zhí)行符號(hào)后面的命令看,反之不執(zhí)行
- name=kk && echo 'My name is $name' 輸出是什么
輸出為:My name is $name
正確寫(xiě)法:name=kk && echo "My name is $name",輸出為,My name is kk
- echo ${num:-cc} 輸出是什么
輸出為cc
解析,若num有賦值,則使用num的值,否則使用-后的值,相當(dāng)于設(shè)置默認(rèn)值
若num=2,則輸出為2
-
'和"的區(qū)別
':強(qiáng)引用,在單引號(hào)內(nèi)的所有內(nèi)容都被當(dāng)成字符串
":弱引用,在雙引號(hào)中可獲取變量的值,例子見(jiàn)27
- 在腳本文件中重定向標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤流到 log.txt文件
exec > log.txt 2>&1
- 只用echo獲取字符串的一部分
a=variable
echo ${a:0:3}
輸出為:vari(注意:空格也占一個(gè)位置)
- variable="User:123:321:/home/dir"用echo獲取路徑
echo ${variable#*:*:*:} 輸出為:/home/dir
# 解析:從variable這變量的開(kāi)頭(#)往后截取,*表示任何數(shù)據(jù),:表示字符串中的分隔符,需要截取的具體內(nèi)容在表達(dá)式不需要占位符
- variable="User:123:321:/home/dir"用echo獲取user這個(gè)字段
echo ${variable%*:*:*:} 輸出為:User
# 解析:%表示從后面往前截取
- 列出UID小于100的用戶
awk -F":" '$3<100' /etc/passwd
35. 寫(xiě)程序?yàn)橛脩粲?jì)算主組數(shù)目 并顯示次數(shù)和組名
#!/bin/bash
cat /etc/passwd|cut -d: -f4|sort|uniq -c|while read c g
do
{ echo $c; grep :$g: /etc/group|cut -d: -f1;}|xargs -n 2
done
36. 如何在bash shell中更改標(biāo)準(zhǔn)的域分隔符為:
IFS=":"
- 獲取變量的長(zhǎng)度
a="abcd"
echo ${#a}
輸出為:4
- 打印變量的最后5個(gè)字符
a=abcd
echo ${a: -3} #注意分號(hào)后面有空格,沒(méi)有空格則效果如例28
輸出為:bcd
- 用echo替換字符串的一部分
a=aabcd
echo ${a//aa/kk}
輸出為:kkbcd
40. 哪個(gè)命令將命令替換成大寫(xiě)
tr '[:lower:]' '[:upper:]'
- 計(jì)算本地用戶數(shù)目
cat /etc/passwd | wc -l
- 計(jì)算字符串中的單詞數(shù)量
a="abc kkk lij uh xsjg yugdfc d dsc"
法1:echo $a | wc -w
法2:set ${a}
echo $#
- export $abc 和 export abc 哪種寫(xiě)法正確
export abc
解析:export用于設(shè)置和顯示環(huán)境變量
export -p:列出所有環(huán)境變量
- 列出第二個(gè)字母是a或b的文件
ls -d ?[ab]*
- 去除字符串中的所有空格
a='jsad iuwef i jgibkh ljv'
echo $a | tr -d " "
解析: tr 命令用于轉(zhuǎn)換(替換)或刪除文件中的字符,-d 刪除
- 輸出數(shù)字0到100中3的倍數(shù),用命令行來(lái)寫(xiě)
法1:for i in {0..100..3}; do echo $i; done
法2:for (( i=0; i<=100; i=i+3 )); do echo "$i"; done
- 打印傳遞給腳本的所有參數(shù)
echo $* 或 echo $@
- [
b ] 和[
b ]的區(qū)別
[ $a == $b ]:用于字符串比較
[ $a -eq $b ]:用于數(shù)字比較
- = 和 == 的區(qū)別
=:用于變量賦值
==:用于字符串比較
- 測(cè)試$a是否大于10
[ $a -gt 10 ]
解析:-gt 大于 -lt 小于 -le 小于等于 -eq 等于
- 檢查字符串是否以“abc”開(kāi)頭
[ $string == abc* ]
- [[
string == "abc" ]] 有什么區(qū)別
1.檢查字符串是否以字母abc開(kāi)頭
2.檢查字符串是否完全等于abc
- 列出以ab 或xy 開(kāi)頭的用戶名
egrep "^ab|^xy" /etc/passwd | cut -d: -f1
解析:egrep是grep的擴(kuò)展,支持更多re規(guī)則,若改用grep輸出為空
- 判斷文件夾是否為空
#!/bin/sh
##方法一 判斷輸出字符數(shù)統(tǒng)計(jì)為0
is_empty_dir(){
return `ls -A $1|wc -w`
}
##方法二 判斷輸出string為空
is_empty_dir(){
return $[ -z `ls -A $1` ]
}
if is_empty_dir $1
then
echo " $1 is empty"
else
echo " $1 is not empty"
fi
- 判斷文件是否為空,不為空則打印文件大小
#! /bin/bash
if [ -s ./file.sh ] ; then #當(dāng)文件大于0時(shí),返回True
echo 'ths file is not empyt and file size:'
du -sh file.sh #打印文件大小
else
echo 'empty!'
fi
- $! 表示什么
后臺(tái)最近執(zhí)行命令的pid
- $?表示什么
前臺(tái)最近命令的結(jié)束狀態(tài)
- 顯示當(dāng)前shell的pid
echo $$
-
@ 有什么區(qū)別
$*:以一個(gè)字符串形式輸出所有傳遞到腳本的參數(shù)
$@:以$IFS為分隔符列出所有傳遞到腳本的參數(shù)
- 在bash中定義數(shù)組
list=("a" "b" "c")
- 打印數(shù)組的第一個(gè)元素
echo ${list[0]}
- 打印數(shù)組的所有元素
echo ${list[@]}
- 輸出所有數(shù)組索引
echo ${!list[@]}
- 移除數(shù)組中索引為2的元素
unset list[2]
- 添加id為3的元素
list[3]="kk"
- 列出shell腳本獲取輸入的值的方法
法1:bash test.sh a b #a b 為參數(shù)傳入腳本
法2:read -p "請(qǐng)輸入:" variable
執(zhí)行命令或腳本時(shí)需要鍵盤(pán)輸入一個(gè)參數(shù),這個(gè)參數(shù)將賦值給variable
- expect的使用(自動(dòng)交互方法)
/usr/bin/expect << EOD
spawn rsync -ar ${line} ${desthost}:${destpath}
expect "*?assword:*"
send "${password}\r"
expect eof
EOD
- 用戶登錄Linux需要執(zhí)行的文件(有順序)
/etc/profile--->(~/.bash_profile ) ---> ~/.bashrc ---> /etc/bashrc
- 獲取系統(tǒng)當(dāng)前時(shí)間(年月日時(shí)分秒)
date +%Y-%m-%d_%H:%M:%S