Shell脚本示例代码
?1. echo_printf_usage.sh:?echo和printf的用法
#! /bin/bash# echo和printf的用法# echo是用于終端打印的基本命令.在默認情況下,echo在每次調用后會添加一個換行符
echo "hello, beijing"
echo "$(pwd)"
echo '$(pwd)' # 結果并不是希望得到的,將會輸出: $(pwd)
echo $(pwd) # 輸出結果同 echo "$(pwd)"# 在默認情況下,echo會將一個換行符追加到輸出文本的尾部.可以使用標志”-n”來忽略結尾的換行符
echo -n what is your name?
echo 'hello, spring'# 如果需要使用轉義序列,則采用echo -e 這種形式
echo -e "1\t2\t3"
echo "\"china beijing\""# 顯示結果定向至文件
echo "csdn blog: https://blog.csdn.net/fengbingchun" > a.txt# 反引號用于執行命令
echo "date: `date`"# printf是另一個可用于終端打印的命令,它使用的參數和C語言中的printf函數一樣
# 默認printf不會像echo自動添加換行符,我們可以手動添加\n
# %-10s 指一個寬度為10個字符(-表示左對齊,沒有則表示右對齊),任何字符都會被顯示在10個字符寬的字符內,如果不足則自動以空格填充,超過也會將內容全部顯示出來
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# 輸入輸出重定向的使用# 重定向一般通過在命令間插入特定的符號來實現
# 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 : 將開始標記tag和結束標記tag之間的內容作為輸入
# 文件描述符0通常是標準輸入(STDIN),1是標準輸出(STDOUT),2是標準錯誤輸出(STDERR)if [ $# != 1 ]; thenecho "usage: $0 file_name"echo "e.g: $0 ./a.txt"exit 1
fi# 輸出重定向:注意任何${1}內的已經存在的內容將被新內容替代.如果要將新內容添加在文件末尾,需要使用>>操作符
echo `who` > ${1}
echo `pwd` >> ${1}# 輸入重定向:
3.?parameter_usage.sh:參數的使用?
?#! /bin/bash# 參數的使用# 我們可以在執行Shell腳本時,向腳本傳遞參數,腳本內獲取參數的格式為:$n. n代表一個數字,1為執行腳本的第一個參數,2為執行腳本的第二個參數,以此類推if [ $# != 3 ]; thenecho "usage: $0 param1 param2 param3"echo "e.g: $0 1 2 3"exit 1
fiecho "執行文件名: $0"
echo "param1: $1"; echo "param2: $2"; echo "param3: $3"# 特殊字符用來處理參數
# $#: 傳遞到腳本的參數個數
echo "參數個數為: $#"
# $*: 以一個單字符串顯示所有向腳本傳遞的參數
echo "傳遞的參數作為一個字符串顯示: $*"
# $@: 與$*相同,但是使用時加引號,并在引號中返回每個參數
echo "傳遞的參數作為字符串顯示: $@"for i in "$*"; do # 循環一次echo "loop"; echo $i
doneecho ""
for i in "$@"; do # 循環三次echo "loop"; echo $i
done
4.?variable_usage.sh:變量的用法?
?#! /bin/bash# 變量的用法# 腳本語言通常不需要在使用變量之前聲明其類型.只需要直接賦值就可以了.在Bash中,每一個變量的值都是字符串
# 無論你給變量賦值時有沒有使用引號,值都會以字符串的形式存儲.
# 有一些特殊的變量會被shell環境和操作系統環境用來存儲一些特別的值,這類變量被稱為環境變量# 變量名的命名須遵循如下規則:
# 變量名和等號之間不能有空格;命名只能使用英文字母,數字和下劃線,首個字符不能以數字開頭;
# 中間不能有空格,可以使用下劃線"_"; 不能使用標點符號; 不能使用bash里的關鍵字.# 運行shell時,會同時存在三種變量
# 局部變量:在腳本或命令中定義,僅在當前shell實例中有效,其他shell啟動的程序不能訪問局部變量
# 環境變量:所有的程序,包括shell啟動的程序,都能訪問環境變量,有些程序需要環境變量來保證其正常運行.必要的時候shell腳本也可以定義環境變量
# shell變量:是由shell程序設置的特殊變量.shell變量中有一部分是環境變量,有一部分是局部變量,這些變量保證了shell的正常運行# 如果value不包含任何空白字符(如空格),那么它不需要使用引號進行引用,反之,則必須使用單引號或雙引號
var=value # var = value 是錯誤的, "="兩邊不能有空格# 變量名外面的花括號是可選的,加不加都行,加花括號是為了幫助解釋器識別變量的邊界
# 推薦給所有變量加上花括號
echo $var # 注意echo $(var) 是錯誤的
echo ${var}fruit=apple
count=5
echo "We have $count ${fruit}(s)"# 已定義的變量,可以被重新定義
var=1234567890
echo ${#var} # 獲得變量值的長度# 環境變量
echo "PATH: ${PATH}"
echo "HOME: ${HOME}"
echo "PWD: ${PWD}"
echo "USER: ${USER}"
echo "UID: ${UID}"
echo "SHELL: ${SHELL}"# 除了顯式地直接賦值,還可以用語句給變量賦值
# 將 /etc 下目錄的文件名循環出來
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# 字符串的使用# 字符串可以用單引號,也可以用雙引號,也可以不用引號# 單引號:
str='this is a string'; echo "${str}"
# 單引號字符串的限制:
# 單引號里的任何字符都會原樣輸出,單引號字符串中的變量是無效的
# 單引號字串中不能出現單引號(對單引號使用轉義符后也不行)
echo '${str}' # print: ${str}# 雙引號: 雙引號里可以有變量;雙引號里可以出現轉義字符# 拼接字符串
var1="hello"; var2="beijing"
var3="hi, ${var1}, ${var2}!"; echo "${var3}"# 獲取字符串長度
echo "var3 length: ${#var3}"# 抓取子字符串
# 從var3字符串第2個字符開始截取4個字符
echo "${var3}"; echo "${var3:1:4}"# 查找子字符串: 注意:找出字符串中字符第一次出現的位置,若找不到則expr index返回0. 注意它匹配的是字符而非字符串
echo "${var3}"; echo `expr index "${var3}" i`
6.?operator_usage.sh:運算符的使用?
?#! /bin/bash# 運算符的使用# expr是一款表達式計算工具,使用它能完成表達式的求值操作,可以用于基本算數操作
# 注意:表達式和運算符之間要有空格; 完整的表達式要被` `包含
val1=3; val2=5
val=`expr ${val1} + ${val2}`
echo "val = ${val}"# let命令可以直接執行基本的算數操作.當使用let時,變量名之前不需要再添加”$”.
# 操作符”[]”的使用方法和let命令類似.也可以使用”(())”,但使用”(())”時,變量名之前需要加上$
let ret=val1+val2
echo "ret: ${ret}"ret=$((val1*val2))
echo "ret: ${ret}"# expr和let都不支持浮點運算,bc支持浮點運算
ret=`echo "${val1} * 1.5" | bc`
echo "ret: ${ret}"# 算術運算符:+、-、×、/、%、=、==、!=
# 注意:條件表達式要放在方括號之間,并且要有空格;乘號(*)前邊必須加反斜杠(\)才能實現乘法運算
val=`expr ${val1} \* ${val2}`
echo "val = ${val}"if [ ${val1} == ${val2} ]; thenecho "${val1} 等于 ${val2}"
elseecho "${val1} 不等于 ${val2}"
fi# 關系運算符: -eq、-ne、-gt、-lt、-ge、-le,返回true或false
# 注意:關系運算符只支持數字,不支持字符串,除非字符串的值是數字
if [ ${val1} -lt ${val2} ]; thenecho "${val1} 小于 ${val2}"
elseecho "${val1} 不小于 ${val2}"
fi# 布爾運算符: !(非)、-o(或)、-a(與),返回true或false
if [ ${val1} -eq ${val2} -o ${val1} -lt ${val2} ]; thenecho "${val1} 等于或小于 ${val2}"
elseecho "${val1} 大于 ${val2}"
fi# 邏輯運算符:&&、||,返回true或false
val3=2
if [[ ${val1} -gt ${val3} && ${val2} -ge ${val3} ]]; then # 注意:這里要用兩個[[ ]]echo "${val1} > ${val3} 且 ${val2} >= ${val3}"
elseecho "${val1} <= ${val3} 且 ${val2} < ${val3}"
fi# 字符串運算符:=、!=、-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# 文件測試運算符:用于檢測Unix文件的各種屬性
# -b file: 檢測文件是否是塊設備文件,如果是,則返回 true
# -c file: 檢測文件是否是字符設備文件,如果是,則返回 true
# -d file: 檢測文件是否是目錄,如果是,則返回 true
# -f file: 檢測文件是否是普通文件(既不是目錄,也不是設備文件),如果是,則返回 true
# -g file: 檢測文件是否設置了 SGID 位,如果是,則返回 true
# -r file: 檢測文件是否可讀,如果是,則返回 true
# -w file: 檢測文件是否可寫,如果是,則返回 true
# -x file: 檢測文件是否可執行,如果是,則返回 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} 是可讀、可寫、可執行的,文件不為空,文件存在 "
fiif [ -f ${file} ]; thenecho "${file} 是普通文件"
fidir="../Samples_Shell"
if [ -d ${dir} ]; thenecho "${dir} 是目錄"
fi# test命令用于檢查某個條件是否成立,它可以進行數值、字符和文件三個方面的測試
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 # 注意是兩個(( ))echo "val: ${val}"let val++
done# until: 執行一系列命令直至條件為true時停止
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:數組的使用?
?#! /bin/bash# 數組的使用# bash支持一維數組(不支持多維數組),初始化時不需要定義數組大小,并且沒有限定數組的大小。
# 類似與C語言,數組元素的下標由0開始編號.獲取數組中的元素要利用下標,下標可以是整數或算術表達式,其值應大于或等于0.# 定義數組:在Shell中,用括號來表示數組,數組元素用"空格"符號分割開
arr=(hi bei jing)
echo "${arr[0]} ${arr[1]} ${arr[2]}"
# 也可以單獨定義數組的各個分量
arr[1]="tian"
# 讀取數組
echo "${arr[0]} ${arr[1]} ${arr[2]}"
# 使用@符號可以獲取數組中的所有元素
echo "${arr[@]}"# 獲取數組的長度
echo "length: ${#arr[@]}" # 3
echo "length: ${#arr[*]}" # 3
# 取得數組單個元素的長度
echo "sub length: ${#arr[2]}"# 獲取數組所有元素的長度
length=0
for i in "${arr[@]}"; dolet length+=${#i}
done
echo "all length: ${length}"
9.?function_usage.sh:函數的使用?
?#! /bin/bash# 函數的使用# 可以帶function fun()定義,也可以直接fun()定義,不帶任何參數
# 參數返回,可以顯示加:return 返回,如果不加,將以最后一條命令運行結果,作為返回值
fun1() {echo "this is a shell function!"
}echo "調用fun()函數"
# 注意:調用函數僅使用其函數名即可;所有函數在使用前必須定義
fun1#
val=5
echo "val: ${val}"fun2() {let val=val+5
}fun2
echo "val: ${val}"# 函數返回值在調用該函數后通過$?來獲得
fun3 () {val1=20; val2=30let val3=val1+val2return ${val3}
}fun3
echo "${val1} + ${val2} = $?"# 函數參數
fun4() {echo "第一個參數為: ${1}"echo "第二個參數為: ${2}"echo "參數總數有 $# 個"echo "作為一個字符串輸出所有參數: $*"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"# 判斷每行中是否含有指定字符,對滿足條件的行寫入指定的文件
echo "2." >> "$2"
sub="88"
while IFS='' read -r line || [[ -n "$line" ]]; doif [[ "$line" != "${line%$sub*}" ]]; thenecho "${line}" >> "$2"fi
done < "$1"# 如果每行字符長度大于5,則移除每行中最后5個字符,并寫入指定的文件
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個字符,并寫入指定的文件
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# 遍歷指定目錄(當前層)下所有文件和目錄,并寫入指定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的后面,否則將會查找指定目錄下的所有文件
echo "${name}" >> ${2}# 遍歷指定目錄下帶有Samples_*名字的子目錄,僅將子目錄下帶有*.cpp的文件寫入指定txt文件,不包括名字前面的路徑,并且每個名字單獨占一行
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,可以打印較多輸出信息,一般在調試定位問題時可以使用# 一些特殊使用# 可以打印較多輸出信息,一般在調試定位問題時可以使用,等同于 #! /bin/bash -x
#set -x# ------------------------------
echo "shell name: $0"
# 獲取此腳本的絕對路徑文件名
real_path=$(realpath $0)
echo "real path: ${real_path}"
# 獲取此腳本的絕對路徑名
dir_name=`dirname "${real_path}"`
echo "dir_name: ${dir_name}"# ------------------------------
# 調用另一個腳本,注意"."
. array_usage.sh# ------------------------------
# mktemp命令用于建立暫存文件
tmp_dir=`mktemp` # 帶絕對路徑文件名
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##*/}"# 如果指定目錄不存在,則創建
if [[ ! -d ${tmp_dir} ]]; thenmkdir -p ${tmp_dir}
fi# ------------------------------
# 通過find命令查找所有目錄,包含子目錄
# 注意"%P\n"與"%f\n"的區別,“%P”不包含當前目錄即".","%f"包含當前目錄
for dir in `find . -type d -printf '%P\n'`; doecho "dir: ${dir}"
done# ------------------------------
# =~: 匹配正則表達式
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命令: 可從標準輸入或文件中讀取數據,根據指定的格式來轉換數據,再輸出到文件、設備或標準輸出
# 把/dev/null看作"黑洞",它等價于一個只寫文件,所有寫入它的內容都會永遠丟失,而嘗試從它那兒讀取內容則什么也讀不到.然而,/dev/null對命令行和腳本都非常的有用
contents=`dd if=../README.md bs=1 count=17 2>/dev/null` # 禁止標準錯誤的輸出
echo "contents: ${contents}"# ------------------------------
# 通過"%"截斷,%后的內容必須是變量name的最后n個字符,否則不起作用
name="/tmp/abc/xyz.jpg"
echo "name: ${name%.jpg}" # /tmp/abc/xyz
# 通過"::"截斷最后幾個字符
echo "name: ${name::-4}" # /tmp/abc/xyz# ------------------------------
# 通過"##"截斷最前面幾個字符,##后的內容必須是變量name的最前n個字符,否則不起作用
echo "name: ${name##/tmp}" # /abc/xyz.jpg
# 通過":"截斷最前面幾個字符
echo "name: ${name:4}" # /abc/xyz.jpg# ------------------------------
# 通過sed解析指定文件中的指定字段,并根據要求寫入到另一指定文件中
sed '/typedef struct/,/}/!d;//d' file.txt | sed 's/x[0-9]://' | sed 's/y[0-9]://' | sed 's/$/,/' # > ./tmp/tmp.txt# ------------------------------
# 通過find查找指定的所有文件,然后通過xargs將所有文件按照要求進行修改
# -I {}的參數:就是在xargs后續命令里,用{}代表xargs之前的命令結果
find . -name "*.sh" | xargs -I {} sed 's/echo/echo -e/' {} > ./tmp/tmp.txt
find . -name "*.sh" | xargs -I {} cp {} ./tmp/# ------------------------------
# $?: 上個命令的退出狀態或函數的返回值.一般情況下,大部分命令執行成功會返回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 "注意:非首次執行上面的命令會返回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}兩邊不帶雙引號,則會將原文件中的空格給移除掉fidone < "${path_file_name}"mv ${tmp_file} ${path_file_name}fi
done
14.?analysis_log_file_delete_lines.sh:刪除文本文件中含有指定字符串的所有行
#! /bin/bash# 作用:輸入源log文件,生成新log文件,新文件是刪除了所有行中帶有指定字符串的行
# 用法:輸入參數依次為:源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文件,新文件是僅含有帶有指定字符串的行
# 用法:輸入參數依次為:源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
?
總結
以上是生活随笔為你收集整理的Shell脚本示例代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吴恩达老师深度学习视频课笔记:卷积神经网
- 下一篇: Ubuntu 14.04 64位上配置J