Shell脚本示例代码
?1. echo_printf_usage.sh:?echo和printf的用法
#! /bin/bash# echo和printf的用法# echo是用于終端打印的基本命令.在默認(rèn)情況下,echo在每次調(diào)用后會(huì)添加一個(gè)換行符
echo "hello, beijing"
echo "$(pwd)"
echo '$(pwd)' # 結(jié)果并不是希望得到的,將會(huì)輸出: $(pwd)
echo $(pwd) # 輸出結(jié)果同 echo "$(pwd)"# 在默認(rèn)情況下,echo會(huì)將一個(gè)換行符追加到輸出文本的尾部.可以使用標(biāo)志”-n”來忽略結(jié)尾的換行符
echo -n what is your name?
echo 'hello, spring'# 如果需要使用轉(zhuǎn)義序列,則采用echo -e 這種形式
echo -e "1\t2\t3"
echo "\"china beijing\""# 顯示結(jié)果定向至文件
echo "csdn blog: https://blog.csdn.net/fengbingchun" > a.txt# 反引號(hào)用于執(zhí)行命令
echo "date: `date`"# printf是另一個(gè)可用于終端打印的命令,它使用的參數(shù)和C語言中的printf函數(shù)一樣
# 默認(rèn)printf不會(huì)像echo自動(dòng)添加換行符,我們可以手動(dòng)添加\n
# %-10s 指一個(gè)寬度為10個(gè)字符(-表示左對(duì)齊,沒有則表示右對(duì)齊),任何字符都會(huì)被顯示在10個(gè)字符寬的字符內(nèi),如果不足則自動(dòng)以空格填充,超過也會(huì)將內(nèi)容全部顯示出來
printf "hello, world\n"
printf "%-5s %-10s %-4s\n" No Name Mark
printf "%-5s %-10s %-4.2f\n" 1 Sarath 80.3456
printf "%-5s %-10s %-4.2f\n" 2 James 90.9989
printf "%-5s %-10s %-4.2f\n" 3 Jeff 77.564val=5
printf "val: %d\n" ${val}
2.?input_output_redirection_usage.sh:輸入輸出重定向的使用?
?#! /bin/bash# 輸入輸出重定向的使用# 重定向一般通過在命令間插入特定的符號(hào)來實(shí)現(xiàn)
# command > file : 將輸出重定向到file
# command < file : 將輸入重定向到file
# command >> file : 將輸出以追加的方式重定向到file
# n > file : 將文件描述符為n的文件重定向到file
# n >> file : 將文件描述符為n的文件以追加的方式重定向到file
# n >& m : 將輸出文件m和n合并
# n <& m : 將輸入文件m和n合并
# << tag : 將開始標(biāo)記tag和結(jié)束標(biāo)記tag之間的內(nèi)容作為輸入
# 文件描述符0通常是標(biāo)準(zhǔn)輸入(STDIN),1是標(biāo)準(zhǔn)輸出(STDOUT),2是標(biāo)準(zhǔn)錯(cuò)誤輸出(STDERR)if [ $# != 1 ]; thenecho "usage: $0 file_name"echo "e.g: $0 ./a.txt"exit 1
fi# 輸出重定向:注意任何${1}內(nèi)的已經(jīng)存在的內(nèi)容將被新內(nèi)容替代.如果要將新內(nèi)容添加在文件末尾,需要使用>>操作符
echo `who` > ${1}
echo `pwd` >> ${1}# 輸入重定向:
3.?parameter_usage.sh:參數(shù)的使用?
?#! /bin/bash# 參數(shù)的使用# 我們可以在執(zhí)行Shell腳本時(shí),向腳本傳遞參數(shù),腳本內(nèi)獲取參數(shù)的格式為:$n. n代表一個(gè)數(shù)字,1為執(zhí)行腳本的第一個(gè)參數(shù),2為執(zhí)行腳本的第二個(gè)參數(shù),以此類推if [ $# != 3 ]; thenecho "usage: $0 param1 param2 param3"echo "e.g: $0 1 2 3"exit 1
fiecho "執(zhí)行文件名: $0"
echo "param1: $1"; echo "param2: $2"; echo "param3: $3"# 特殊字符用來處理參數(shù)
# $#: 傳遞到腳本的參數(shù)個(gè)數(shù)
echo "參數(shù)個(gè)數(shù)為: $#"
# $*: 以一個(gè)單字符串顯示所有向腳本傳遞的參數(shù)
echo "傳遞的參數(shù)作為一個(gè)字符串顯示: $*"
# $@: 與$*相同,但是使用時(shí)加引號(hào),并在引號(hào)中返回每個(gè)參數(shù)
echo "傳遞的參數(shù)作為字符串顯示: $@"for i in "$*"; do # 循環(huán)一次echo "loop"; echo $i
doneecho ""
for i in "$@"; do # 循環(huán)三次echo "loop"; echo $i
done
4.?variable_usage.sh:變量的用法?
?#! /bin/bash# 變量的用法# 腳本語言通常不需要在使用變量之前聲明其類型.只需要直接賦值就可以了.在Bash中,每一個(gè)變量的值都是字符串
# 無論你給變量賦值時(shí)有沒有使用引號(hào),值都會(huì)以字符串的形式存儲(chǔ).
# 有一些特殊的變量會(huì)被shell環(huán)境和操作系統(tǒng)環(huán)境用來存儲(chǔ)一些特別的值,這類變量被稱為環(huán)境變量# 變量名的命名須遵循如下規(guī)則:
# 變量名和等號(hào)之間不能有空格;命名只能使用英文字母,數(shù)字和下劃線,首個(gè)字符不能以數(shù)字開頭;
# 中間不能有空格,可以使用下劃線"_"; 不能使用標(biāo)點(diǎn)符號(hào); 不能使用bash里的關(guān)鍵字.# 運(yùn)行shell時(shí),會(huì)同時(shí)存在三種變量
# 局部變量:在腳本或命令中定義,僅在當(dāng)前shell實(shí)例中有效,其他shell啟動(dòng)的程序不能訪問局部變量
# 環(huán)境變量:所有的程序,包括shell啟動(dòng)的程序,都能訪問環(huán)境變量,有些程序需要環(huán)境變量來保證其正常運(yùn)行.必要的時(shí)候shell腳本也可以定義環(huán)境變量
# shell變量:是由shell程序設(shè)置的特殊變量.shell變量中有一部分是環(huán)境變量,有一部分是局部變量,這些變量保證了shell的正常運(yùn)行# 如果value不包含任何空白字符(如空格),那么它不需要使用引號(hào)進(jìn)行引用,反之,則必須使用單引號(hào)或雙引號(hào)
var=value # var = value 是錯(cuò)誤的, "="兩邊不能有空格# 變量名外面的花括號(hào)是可選的,加不加都行,加花括號(hào)是為了幫助解釋器識(shí)別變量的邊界
# 推薦給所有變量加上花括號(hào)
echo $var # 注意echo $(var) 是錯(cuò)誤的
echo ${var}fruit=apple
count=5
echo "We have $count ${fruit}(s)"# 已定義的變量,可以被重新定義
var=1234567890
echo ${#var} # 獲得變量值的長度# 環(huán)境變量
echo "PATH: ${PATH}"
echo "HOME: ${HOME}"
echo "PWD: ${PWD}"
echo "USER: ${USER}"
echo "UID: ${UID}"
echo "SHELL: ${SHELL}"# 除了顯式地直接賦值,還可以用語句給變量賦值
# 將 /etc 下目錄的文件名循環(huán)出來
for file in `ls /etc`; doecho ${file}
donefor file in $(ls .); doecho ${file}
done# 只讀變量:使用readonly命令可以將變量定義為只讀變量,只讀變量的值不能被改變
readonly var; #var=2 # Error: var: readonly variable# 刪除變量:使用unset命令可以刪除變量,變量被刪除后不能再次使用。unset命令不能刪除只讀變量
unset count; echo "count: ${count}"
unset var; echo "var: ${var}" # Error: var: cannot unset: readonly variable
5.?string_usage.sh:字符串的使用?
?#! /bin/bash# 字符串的使用# 字符串可以用單引號(hào),也可以用雙引號(hào),也可以不用引號(hào)# 單引號(hào):
str='this is a string'; echo "${str}"
# 單引號(hào)字符串的限制:
# 單引號(hào)里的任何字符都會(huì)原樣輸出,單引號(hào)字符串中的變量是無效的
# 單引號(hào)字串中不能出現(xiàn)單引號(hào)(對(duì)單引號(hào)使用轉(zhuǎn)義符后也不行)
echo '${str}' # print: ${str}# 雙引號(hào): 雙引號(hào)里可以有變量;雙引號(hào)里可以出現(xiàn)轉(zhuǎn)義字符# 拼接字符串
var1="hello"; var2="beijing"
var3="hi, ${var1}, ${var2}!"; echo "${var3}"# 獲取字符串長度
echo "var3 length: ${#var3}"# 抓取子字符串
# 從var3字符串第2個(gè)字符開始截取4個(gè)字符
echo "${var3}"; echo "${var3:1:4}"# 查找子字符串: 注意:找出字符串中字符第一次出現(xiàn)的位置,若找不到則expr index返回0. 注意它匹配的是字符而非字符串
echo "${var3}"; echo `expr index "${var3}" i`
6.?operator_usage.sh:運(yùn)算符的使用?
?#! /bin/bash# 運(yùn)算符的使用# expr是一款表達(dá)式計(jì)算工具,使用它能完成表達(dá)式的求值操作,可以用于基本算數(shù)操作
# 注意:表達(dá)式和運(yùn)算符之間要有空格; 完整的表達(dá)式要被` `包含
val1=3; val2=5
val=`expr ${val1} + ${val2}`
echo "val = ${val}"# let命令可以直接執(zhí)行基本的算數(shù)操作.當(dāng)使用let時(shí),變量名之前不需要再添加”$”.
# 操作符”[]”的使用方法和let命令類似.也可以使用”(())”,但使用”(())”時(shí),變量名之前需要加上$
let ret=val1+val2
echo "ret: ${ret}"ret=$((val1*val2))
echo "ret: ${ret}"# expr和let都不支持浮點(diǎn)運(yùn)算,bc支持浮點(diǎn)運(yùn)算
ret=`echo "${val1} * 1.5" | bc`
echo "ret: ${ret}"# 算術(shù)運(yùn)算符:+、-、×、/、%、=、==、!=
# 注意:條件表達(dá)式要放在方括號(hào)之間,并且要有空格;乘號(hào)(*)前邊必須加反斜杠(\)才能實(shí)現(xiàn)乘法運(yùn)算
val=`expr ${val1} \* ${val2}`
echo "val = ${val}"if [ ${val1} == ${val2} ]; thenecho "${val1} 等于 ${val2}"
elseecho "${val1} 不等于 ${val2}"
fi# 關(guān)系運(yùn)算符: -eq、-ne、-gt、-lt、-ge、-le,返回true或false
# 注意:關(guān)系運(yùn)算符只支持?jǐn)?shù)字,不支持字符串,除非字符串的值是數(shù)字
if [ ${val1} -lt ${val2} ]; thenecho "${val1} 小于 ${val2}"
elseecho "${val1} 不小于 ${val2}"
fi# 布爾運(yùn)算符: !(非)、-o(或)、-a(與),返回true或false
if [ ${val1} -eq ${val2} -o ${val1} -lt ${val2} ]; thenecho "${val1} 等于或小于 ${val2}"
elseecho "${val1} 大于 ${val2}"
fi# 邏輯運(yùn)算符:&&、||,返回true或false
val3=2
if [[ ${val1} -gt ${val3} && ${val2} -ge ${val3} ]]; then # 注意:這里要用兩個(gè)[[ ]]echo "${val1} > ${val3} 且 ${val2} >= ${val3}"
elseecho "${val1} <= ${val3} 且 ${val2} < ${val3}"
fi# 字符串運(yùn)算符:=、!=、-z(檢測字符串長度是否為0,為0返回true)、-n(檢測字符串長度是否為0,不為0返回true)等
str1="abc"; str2="def"; str3=""
if [ ${str1} != ${str2} ]; thenecho "${str1} != ${str2}"
elseecho "${str1} == ${str2}"
fiif [ -z ${str3} ]; thenecho "${str3} 長度為0"
fiif [ -n ${str1} ]; thenecho "${str1} 長度不為0"
fiif [ ${str1} ]; thenecho "${str1} 不為空"
fi# 文件測試運(yùn)算符:用于檢測Unix文件的各種屬性
# -b file: 檢測文件是否是塊設(shè)備文件,如果是,則返回 true
# -c file: 檢測文件是否是字符設(shè)備文件,如果是,則返回 true
# -d file: 檢測文件是否是目錄,如果是,則返回 true
# -f file: 檢測文件是否是普通文件(既不是目錄,也不是設(shè)備文件),如果是,則返回 true
# -g file: 檢測文件是否設(shè)置了 SGID 位,如果是,則返回 true
# -r file: 檢測文件是否可讀,如果是,則返回 true
# -w file: 檢測文件是否可寫,如果是,則返回 true
# -x file: 檢測文件是否可執(zhí)行,如果是,則返回 true
# -s file: 檢測文件是否為空(文件大小是否大于0),不為空返回 true
# -e file: 檢測文件(包括目錄)是否存在,如果是,則返回 true
file="./operator_usage.sh"
if [[ -r ${file} && -w ${file} && -x ${file} && -s ${file} && -e ${file} ]]; thenecho "${file} 是可讀、可寫、可執(zhí)行的,文件不為空,文件存在 "
fiif [ -f ${file} ]; thenecho "${file} 是普通文件"
fidir="../Samples_Shell"
if [ -d ${dir} ]; thenecho "${dir} 是目錄"
fi# test命令用于檢查某個(gè)條件是否成立,它可以進(jìn)行數(shù)值、字符和文件三個(gè)方面的測試
if test ${val1} -le ${val2}; thenecho "${val1} <= ${val2}"
fiif test ${str1} != ${str2}; thenecho "${str1} != ${str2}"
fiif test -r ${file}; thenecho "${file} 可讀"
fi
7.?if_for_while_case_usage.sh?:if, for, while, case的使用
?#! /bin/bash# if、for、while、case的使用# if
val1=5; val2=10
if [ ${val1} == ${val2} ]; thenecho "${val1} == ${val2}"
elif [ ${val1} -gt ${val2} ]; thenecho "${val1} > ${val2}"
elseecho "${val1} < ${val2}"
fi# for
arr=(1 2 3 4 5)
for val in ${arr[@]}; doecho "val ${val}"
done# while
val=1
while (( ${val} <= 5 )); do # 注意是兩個(gè)(( ))echo "val: ${val}"let val++
done# until: 執(zhí)行一系列命令直至條件為true時(shí)停止
val=1
until [ ! ${val} -lt 5 ]; doecho "val: ${val}"val=`expr ${val} + 1`
done# case
val=4 # 2
case ${val} in1) echo "val = 1" ;;2) echo "val = 2" ;;3) echo "val = 3" ;;*) echo "val is other value" ;;
esac# break
for val in ${arr[@]}; doecho "val: ${val}"if [ ${val} == 2 ]; thenbreakfi
done# continue
for val in ${arr[@]}; doif [ ${val} == 2 ]; thencontinuefiecho "val: ${val}"
done
8.?array_usage.sh:數(shù)組的使用?
?#! /bin/bash# 數(shù)組的使用# bash支持一維數(shù)組(不支持多維數(shù)組),初始化時(shí)不需要定義數(shù)組大小,并且沒有限定數(shù)組的大小。
# 類似與C語言,數(shù)組元素的下標(biāo)由0開始編號(hào).獲取數(shù)組中的元素要利用下標(biāo),下標(biāo)可以是整數(shù)或算術(shù)表達(dá)式,其值應(yīng)大于或等于0.# 定義數(shù)組:在Shell中,用括號(hào)來表示數(shù)組,數(shù)組元素用"空格"符號(hào)分割開
arr=(hi bei jing)
echo "${arr[0]} ${arr[1]} ${arr[2]}"
# 也可以單獨(dú)定義數(shù)組的各個(gè)分量
arr[1]="tian"
# 讀取數(shù)組
echo "${arr[0]} ${arr[1]} ${arr[2]}"
# 使用@符號(hào)可以獲取數(shù)組中的所有元素
echo "${arr[@]}"# 獲取數(shù)組的長度
echo "length: ${#arr[@]}" # 3
echo "length: ${#arr[*]}" # 3
# 取得數(shù)組單個(gè)元素的長度
echo "sub length: ${#arr[2]}"# 獲取數(shù)組所有元素的長度
length=0
for i in "${arr[@]}"; dolet length+=${#i}
done
echo "all length: ${length}"
9.?function_usage.sh:函數(shù)的使用?
?#! /bin/bash# 函數(shù)的使用# 可以帶function fun()定義,也可以直接fun()定義,不帶任何參數(shù)
# 參數(shù)返回,可以顯示加:return 返回,如果不加,將以最后一條命令運(yùn)行結(jié)果,作為返回值
fun1() {echo "this is a shell function!"
}echo "調(diào)用fun()函數(shù)"
# 注意:調(diào)用函數(shù)僅使用其函數(shù)名即可;所有函數(shù)在使用前必須定義
fun1#
val=5
echo "val: ${val}"fun2() {let val=val+5
}fun2
echo "val: ${val}"# 函數(shù)返回值在調(diào)用該函數(shù)后通過$?來獲得
fun3 () {val1=20; val2=30let val3=val1+val2return ${val3}
}fun3
echo "${val1} + ${val2} = $?"# 函數(shù)參數(shù)
fun4() {echo "第一個(gè)參數(shù)為: ${1}"echo "第二個(gè)參數(shù)為: ${2}"echo "參數(shù)總數(shù)有 $# 個(gè)"echo "作為一個(gè)字符串輸出所有參數(shù): $*"let val=${1}+${2}echo "val: ${val}"
}fun4 -5 -10
10.?read_txt_file_analysis.sh:讀取文本文件分析?
?#! /bin/bash# 讀取txt文件并分析if [ $# != 2 ]; thenecho "usage: $0 src_txt_file dst_txt_file"echo "e.g: $0 ./a.txt ./b.txt"exit 1
fi# 讀指定的txt文件,并將每行打印輸出
echo "1." >> "$2"
while IFS='' read -r line || [[ -n "$line" ]]; doecho "Text read from file: $line" >> "$2"
done < "$1"# 判斷每行中是否含有指定字符,對(duì)滿足條件的行寫入指定的文件
echo "2." >> "$2"
sub="88"
while IFS='' read -r line || [[ -n "$line" ]]; doif [[ "$line" != "${line%$sub*}" ]]; thenecho "${line}" >> "$2"fi
done < "$1"# 如果每行字符長度大于5,則移除每行中最后5個(gè)字符,并寫入指定的文件
echo "3." >> "$2"
value=5
while IFS='' read -r line || [[ -n "$line" ]]; dolength=${#line}#echo "length: ${length}"if [[ "${length}" -ge "${vale}" ]]; thenecho "${line::-${value}}" >> "$2"fi
done < "$1"# 如果每行字符長度大于10,則移除每行中最前10個(gè)字符,并寫入指定的文件
echo "4." >> "$2"
value=10
while IFS='' read -r line || [[ -n "$line" ]]; dolength=${#line}if [[ "${length}" -ge "${vale}" ]]; thenecho "${line:${value}}" >> "$2"fi
done < "$1"# 判斷每行中是否含有指定字符,若有則用指定的字符替換原有的字符,并寫入指定的文件
echo "5." >> "$2"
sub1="group"; sub2="class"
while IFS='' read -r line || [[ -n "$line" ]]; doif [[ "$line" != "${line%$sub1*}" ]]; thenecho ${line} | sed -e "s/${sub1}/${sub2}/g" >> "$2"fi
done < "$1"
11.?read_directory_analysis.sh:讀取目錄文件分析?
?#! /bin/bash# 讀取目錄文件并分析if [ $# != 2 ]; thenecho "usage: $0 src_directory dst_txt_file"echo "e.g: $0 ./a ./a.txt"exit 1
fi# 遍歷指定目錄(當(dāng)前層)下所有文件和目錄,并寫入指定txt文件
echo "1." >> $2
for name in `ls $1`; doecho "name: ${name}" >> $2
done# 遍歷指定目錄下所有文件,包括子目錄下的所有文件,并寫入指定txt文件
echo "2." >> $2
for name in $(find $1 -type f -name "*"); doecho "${name}" >> $2
done# 遍歷指定目錄下所有目錄,包括子目錄,并寫入指定txt文件
echo "3." >> $2
for name in $(find $1 -type d -name "*"); doecho "${name}" >> $2
done# 遍歷指定目錄下的所有文件,包括子目錄下的所有文件,按要求修改文件名字,并寫入指定txt文件
echo "4." >> $2
name1="xxx"; name2="yyy"
for name in $(find $1 -type f -name "*${name1}*"); donew_file_name=$(echo ${name} | sed -e "s/${name1}/${name2}/g")echo "${new_file_name}" >> $2mv ${name} ${new_file_name}
done# 遍歷指定目錄下的所有*.cpp文件,僅將.cpp文件名字并寫入指定txt文件,不包括名字前面的路徑
echo "5." >> $2
name=`find ${1} -type f -name "*.cpp" -printf "%f\n"` # 注意:需要將-printf放在-name的后面,否則將會(huì)查找指定目錄下的所有文件
echo "${name}" >> ${2}# 遍歷指定目錄下帶有Samples_*名字的子目錄,僅將子目錄下帶有*.cpp的文件寫入指定txt文件,不包括名字前面的路徑,并且每個(gè)名字單獨(dú)占一行
echo "6." >> ${2}
for name in $(find ${1} -type d -name "Samples_*"); doecho "dir name: ${name}" >> ${2}echo `find ${name} -type f -name "*.cpp" -printf "%f\n"` | tr " " "\n" >> ${2}
done
12.?special_usage.sh:一些特殊使用?
?#! /bin/bash
# 在#! /bin/bash后加-x,可以打印較多輸出信息,一般在調(diào)試定位問題時(shí)可以使用# 一些特殊使用# 可以打印較多輸出信息,一般在調(diào)試定位問題時(shí)可以使用,等同于 #! /bin/bash -x
#set -x# ------------------------------
echo "shell name: $0"
# 獲取此腳本的絕對(duì)路徑文件名
real_path=$(realpath $0)
echo "real path: ${real_path}"
# 獲取此腳本的絕對(duì)路徑名
dir_name=`dirname "${real_path}"`
echo "dir_name: ${dir_name}"# ------------------------------
# 調(diào)用另一個(gè)腳本,注意"."
. array_usage.sh# ------------------------------
# mktemp命令用于建立暫存文件
tmp_dir=`mktemp` # 帶絕對(duì)路徑文件名
tmp_dir=${dir_name}${tmp_dir}
echo "tmp_dir: ${tmp_dir}"
# reference: https://unix.stackexchange.com/questions/137775/how-to-extract-part-of-a-filename-before-or-before-extension
echo "only show tmp_dir name: ${tmp_dir##*/}"# 如果指定目錄不存在,則創(chuàng)建
if [[ ! -d ${tmp_dir} ]]; thenmkdir -p ${tmp_dir}
fi# ------------------------------
# 通過find命令查找所有目錄,包含子目錄
# 注意"%P\n"與"%f\n"的區(qū)別,“%P”不包含當(dāng)前目錄即".","%f"包含當(dāng)前目錄
for dir in `find . -type d -printf '%P\n'`; doecho "dir: ${dir}"
done# ------------------------------
# =~: 匹配正則表達(dá)式
input1=123; input2=4a6; input3="abcdefg"
if [[ ${input1} =~ [0-9][0-9][0-9] ]]; thenecho "${input1} is number"
elseecho "${input1} is not number"
fiif [[ ${input2} =~ [0-9][0-9][0-9] ]]; thenecho "${input2} is number"
elseecho "${input2} is not number"
fiif [[ ${input3} =~ "cde" ]]; thenecho "${input3} include cde"
elseecho "${input3} don't include cde"
fi# ------------------------------
# reference: http://www.runoob.com/linux/linux-comm-dd.html
# dd命令: 可從標(biāo)準(zhǔn)輸入或文件中讀取數(shù)據(jù),根據(jù)指定的格式來轉(zhuǎn)換數(shù)據(jù),再輸出到文件、設(shè)備或標(biāo)準(zhǔn)輸出
# 把/dev/null看作"黑洞",它等價(jià)于一個(gè)只寫文件,所有寫入它的內(nèi)容都會(huì)永遠(yuǎn)丟失,而嘗試從它那兒讀取內(nèi)容則什么也讀不到.然而,/dev/null對(duì)命令行和腳本都非常的有用
contents=`dd if=../README.md bs=1 count=17 2>/dev/null` # 禁止標(biāo)準(zhǔn)錯(cuò)誤的輸出
echo "contents: ${contents}"# ------------------------------
# 通過"%"截?cái)?%后的內(nèi)容必須是變量name的最后n個(gè)字符,否則不起作用
name="/tmp/abc/xyz.jpg"
echo "name: ${name%.jpg}" # /tmp/abc/xyz
# 通過"::"截?cái)嘧詈髱讉€(gè)字符
echo "name: ${name::-4}" # /tmp/abc/xyz# ------------------------------
# 通過"##"截?cái)嘧钋懊鎺讉€(gè)字符,##后的內(nèi)容必須是變量name的最前n個(gè)字符,否則不起作用
echo "name: ${name##/tmp}" # /abc/xyz.jpg
# 通過":"截?cái)嘧钋懊鎺讉€(gè)字符
echo "name: ${name:4}" # /abc/xyz.jpg# ------------------------------
# 通過sed解析指定文件中的指定字段,并根據(jù)要求寫入到另一指定文件中
sed '/typedef struct/,/}/!d;//d' file.txt | sed 's/x[0-9]://' | sed 's/y[0-9]://' | sed 's/$/,/' # > ./tmp/tmp.txt# ------------------------------
# 通過find查找指定的所有文件,然后通過xargs將所有文件按照要求進(jìn)行修改
# -I {}的參數(shù):就是在xargs后續(xù)命令里,用{}代表xargs之前的命令結(jié)果
find . -name "*.sh" | xargs -I {} sed 's/echo/echo -e/' {} > ./tmp/tmp.txt
find . -name "*.sh" | xargs -I {} cp {} ./tmp/# ------------------------------
# $?: 上個(gè)命令的退出狀態(tài)或函數(shù)的返回值.一般情況下,大部分命令執(zhí)行成功會(huì)返回0,失敗返回非0值
# reference: https://stackoverflow.com/questions/6834487/what-is-the-dollar-question-mark-variable-in-shell-scripting/6834512
status=$?
echo "status: ${status}"
if [[ ${status} != 0 ]]; thenecho "注意:非首次執(zhí)行上面的命令會(huì)返回123:find . -name \"*.sh\" | xargs -I {} cp {} ./tmp/ "#exit ${status}
fiecho "ok!!!"#rm -rf ${tmp_dir}
13.?replace_a_string_with_another_string_in_all_files.sh:文件中字符串的替換?
?#! /bin/bash# 用指定的字符串替換指定目錄下所有文件中需要替換的字符串if [ $# != 3 ]; then echo "usage: $0 directory_name src_string dst_string"echo "e.g: $0 ./a abcd 1234"exit 1
fifor file_name in `ls $1`; dopath_file_name=$1/${file_name}if [ -f ${path_file_name} ]; thenecho "path_file_name: ${path_file_name}"tmp_file=tmp.txtwhile IFS='' read -r line || [[ -n "$line" ]]; doif [[ "$line" != "${line%$2*}" ]]; thenecho "${line}" | sed -e "s/$2/$3/g" >> ${tmp_file}else echo "${line}" >> ${tmp_file}# 注意:不是 echo ${line} >> ${tmp_file}# 若 ${line}兩邊不帶雙引號(hào),則會(huì)將原文件中的空格給移除掉fidone < "${path_file_name}"mv ${tmp_file} ${path_file_name}fi
done
14.?analysis_log_file_delete_lines.sh:刪除文本文件中含有指定字符串的所有行
#! /bin/bash# 作用:輸入源log文件,生成新log文件,新文件是刪除了所有行中帶有指定字符串的行
# 用法:輸入?yún)?shù)依次為:源log文件名字,字符串,新log文件文件名字if [ $# != 3 ]; thenecho "Error: usage: $0 log_file_name string new_log_file_name"echo "e.g: $0 ./log.txt abcd ./new_log.txt"exit 1
fiif [[ ! -e $1 ]]; thenecho "Error: file does not exist: $1"exit 1
fiif [[ -e $3 ]]; thenecho "WARNINT: file exist, first need to delete: $3"rm $3
fiwhile IFS='' read -r line || [[ -n "$line" ]]; doif [[ "$line" == "${line%$2*}" ]]; thenecho "${line}" >> "$3"fi
done < "$1"
?15.?analysis_log_file_extract_lines.sh:提取出文本文件中含有指定字符串的所有行
#! /bin/bash# 作用:輸入源log文件,生成新log文件,新文件是僅含有帶有指定字符串的行
# 用法:輸入?yún)?shù)依次為:源log文件名字,字符串,新log文件文件名字if [ $# != 3 ]; thenecho "Error: usage: $0 log_file_name string new_log_file_name"echo "e.g: $0 ./log.txt abcd ./new_log.txt"exit 1
fiif [[ ! -e $1 ]]; thenecho "Error: file does not exist: $1"exit 1
fiif [[ -e $3 ]]; thenecho "WARNINT: file exist, first need to delete: $3"rm $3
fiwhile IFS='' read -r line || [[ -n "$line" ]]; doif [[ "$line" != "${line%$2*}" ]]; thenecho "${line}" >> "$3"fi
done < "$1"
以上腳本主要參考:http://www.runoob.com/linux/linux-shell.html
GitHub: https://github.com/fengbingchun/Linux_Code_Test
?
總結(jié)
以上是生活随笔為你收集整理的Shell脚本示例代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吴恩达老师深度学习视频课笔记:卷积神经网
- 下一篇: Ubuntu 14.04 64位上配置J