手機(jī)客戶端網(wǎng)站怎么做論述搜索引擎優(yōu)化的具體措施
文章目錄
- shell
- 變量
- 全局變量(環(huán)境變量)
- 局部變量
- 設(shè)置PATH 環(huán)境變量
- 修改變量屬性
- 啟動(dòng)文件
- 環(huán)境變量持久化
- ./和. 的區(qū)別
- 腳本編寫(xiě)
- 判斷 和循環(huán)
- 命令行參數(shù)
- 傳入?yún)?shù)
- 循環(huán)讀取命令行參數(shù)
- 獲取用戶輸入
- 處理選項(xiàng)
- 處理簡(jiǎn)單選項(xiàng)
- 處理帶值選項(xiàng)
- 重定向
- 顯示并且同時(shí)輸出到文件
- 替換目錄下的所有文件中某個(gè)關(guān)鍵字
- 刪除關(guān)鍵字所在行
shell
shell的作用是將我們輸入的命令與內(nèi)核溝通。
linux默認(rèn)使用的是bash shell
echo $SHELL
可以查看當(dāng)前使用的shell版本
shell中如果想一次執(zhí)行多條命令,可以用分號(hào)隔開(kāi),多條命令的組合可以放到一個(gè)文件中,我們把它叫做腳本。
date ; cd
這樣就編寫(xiě)了一個(gè)非常簡(jiǎn)單的shell腳本。
變量
存儲(chǔ)shell會(huì)話和工作環(huán)境的相關(guān)信息。
環(huán)境變量存儲(chǔ)在內(nèi)存中,以便shell中運(yùn)行的腳本和程序能夠訪問(wèn)。
環(huán)境變量分為:全局變量和局部變量
全局變量:對(duì)當(dāng)前shell以及所有子shell可見(jiàn)
局部變量:只在當(dāng)前shell可見(jiàn),子shell不可見(jiàn)
所以全局變量和局部變量差異就是是否 可以被子進(jìn)程使用
全局變量(環(huán)境變量)
set 查看當(dāng)前shell所有變量,包括全局和局部
env 查看當(dāng)前shell下所有環(huán)境變量(只能查看全局變量)
printenv HOME 查看某個(gè)全局環(huán)境變量的值
echo $HOME
查看環(huán)境變量
echo $$
查看當(dāng)前shell的pid
export作用是將局部變量轉(zhuǎn)換成全局變量
export my_all_home=/lib/lib
設(shè)定全局環(huán)境變量
子shell可以查看和使用但不能修改父shell中的全局環(huán)境變量
unset my_all_home 刪除環(huán)境比哪里
局部變量
沒(méi)有命令能夠查看所有局部變量
設(shè)定局部變量 myhome=/lib/
查看某個(gè)局部變量
變量?jī)?nèi)若有空格可以使用雙引號(hào)或者單引號(hào)myhome=/lib/ jj
設(shè)置PATH 環(huán)境變量
當(dāng)輸入一個(gè)外部命令時(shí),shell會(huì)搜索系統(tǒng)從中找到對(duì)應(yīng)程序。
PATH環(huán)境變量定義了用于查找命令和程序的目錄。
如果要執(zhí)行的外部命令在PATH中查找不到應(yīng)用程序,則會(huì)報(bào)錯(cuò)。
如果要在PATH后繼續(xù)添加路徑,我們可以使用冒號(hào)累加
export PATH=$PATH:/lib
修改變量屬性
變量默認(rèn)是字符串類型
可以使用declare改變變量類型
declare -a var
將變量修改為數(shù)組類型
啟動(dòng)文件
- 在系統(tǒng)的啟動(dòng)shell中會(huì)啟動(dòng)/etc/profile 一旦啟動(dòng)shell就會(huì)執(zhí)行該文件中的命令
- HOME目錄下的啟動(dòng)文件。在啟用一個(gè)新shell時(shí)會(huì)用到下面的啟動(dòng)文件
ls -a home目錄可以看到
./bashrc ubuntu的home目錄啟動(dòng)文件
環(huán)境變量持久化
所以./bashrc文件的作用就是我們可以將要使用的全局環(huán)境變量放到這個(gè)文件中,那么我們一旦開(kāi)啟新的shell則自動(dòng)擁有這個(gè)環(huán)境變量
如果不想重啟立即生效,則執(zhí)行source ~/.bashrc
./和. 的區(qū)別
-
點(diǎn)空格斜杠執(zhí)行腳本,是相當(dāng)于source 執(zhí)行腳本,也就是說(shuō)在當(dāng)前進(jìn)程中執(zhí)行命令,所以其中所有變量的設(shè)置會(huì)對(duì)當(dāng)前Shell其作用。
-
點(diǎn)斜杠執(zhí)行腳本是外部命令,所以他會(huì)啟動(dòng)子進(jìn)程然后運(yùn)行,所以一些局部變量就不起作用。
也就是說(shuō)設(shè)置環(huán)境變量的時(shí)候我們使用source或者說(shuō). 空格可以直接生效。
腳本編寫(xiě)
使用shell腳本文件,必須在第一行指明所使用的shell版本
#!/bin/bash
表示使用的是bash shell
#!/bin/bashdate
# 打印字符串
echo "let's go"
# 將下一行打印到當(dāng)前行連到一起
echo -n "let's go at:"
date
# 打印環(huán)境變量,兩種均可
echo "HOME: $HOME"
echo "user: ${USER}"# 用戶自定義變量,只在本腳本中生效
var1=10
echo "var1= $var1"
var2=$var1
echo "var2= $var2"# 將shell的輸出賦值給變量
var_date=`date`
echo "$var_date"
判斷 和循環(huán)
# if后面的命令執(zhí)行成功返回0,則可以進(jìn)入then
if date
thenecho "date works"
elseecho "date not work"
fi
# if后面只能跟命令,如果要進(jìn)行條件判斷則需要加大括號(hào)
if [ 1 -eq 2 ]
thenecho "1 = 2"
elseecho "1 != 2"
fi
# while
var2=5
while [ $var2 -gt 0 ]
doecho "$var2 test"var2=$[ $var2-1 ]
done# for var in list 讀取列表
for i in Ala Alb Alc
doecho "test: $i"
donelist="Ala Alb Alc"
if date
thenecho "date works"
elseecho "date not work"
fi
# if后面只能跟命令,如果要進(jìn)行條件判斷則需要加大括號(hào)
if [ 1 -eq 2 ]
thenecho "1 = 2"
elseecho "1 != 2"
fi
# while
var2=5
while [ $var2 -gt 0 ]
doecho "$var2 test"var2=$[ $var2-1 ]
done# for var in list 讀取列表
for i in Ala Alb Alc
doecho "test: $i"
donelist="Ala Alb Alc"
for i in $list
doecho "test: $i"
done# for in c style
for ((i=1; i<10; i++))
doecho "for in c $i"
done
# for遍歷目錄
for file in /home/*
doif [ -d "$file" ]thenecho "$file is a dir"elif [ -f "$file" ]thenecho "$file is a file"fi
done
命令行參數(shù)
傳入?yún)?shù)
對(duì)傳入?yún)?shù)檢查,如果缺少參數(shù)會(huì)產(chǎn)生很糟糕的結(jié)果
# args
echo $0 #./1.sh 不單單是程序名稱
echo $1
if [ -n "$2" ] # 如果有參數(shù)2
# if [ -z "$2" ] 如果沒(méi)有參數(shù)2
thenecho $2
elseecho no args 2
fi
循環(huán)讀取命令行參數(shù)
#當(dāng)前進(jìn)程pid
# $$
#統(tǒng)計(jì)參數(shù)個(gè)數(shù)
echo "param count $#" for param in "$*"
doecho "Parameter * = $param"
done
for param in "$@"
doecho "Parameter @ = $param"
done
./1.sh a b c d
param count 4
Parameter * = a b c d
Parameter @ = a
Parameter @ = b
Parameter @ = c
Parameter @ = d
獲取用戶輸入
當(dāng)執(zhí)行腳本到后,還可以使用read在腳本運(yùn)行中獲取用戶輸入以做下一步判斷。
處理選項(xiàng)
處理簡(jiǎn)單選項(xiàng)
遍歷所有選項(xiàng),選擇符合條件的
while [ -n "$1" ] #循環(huán)檢測(cè)第一個(gè)參數(shù),如果第一個(gè)參數(shù)存在則進(jìn)入循環(huán)
docase "$1" in-a) echo "found the -a option";; # 雙引號(hào)為語(yǔ)法-b) echo "found the -b option";;-c) echo "found the -c option";;*) echo "no matching option";; # 默認(rèn)序列esac # case結(jié)束符shift # 將參數(shù)左移一個(gè)位置
done
(base) [user1@sysqa-h3c-b10 ~]$ ./1.sh -b -c -d -a
found the -b option
found the -c option
no matching option
found the -a option
處理帶值選項(xiàng)
腳本檢測(cè)選項(xiàng)中附加的參數(shù),然后進(jìn)行處理
while [ -n "$1" ] #循環(huán)檢測(cè)第一個(gè)參數(shù),如果第一個(gè)參數(shù)存在則進(jìn)入循環(huán)
#while [ $# -gt 0 ] # 也可以使用這個(gè)判斷,如果參數(shù)個(gè)數(shù)非0
docase "$1" in-a) echo "found the -a option";; # 雙引號(hào)為語(yǔ)法-b) param="$2"echo "found the -b option, param=$param"shift;; #因?yàn)榧恿藗€(gè)參數(shù)所以要移一位-c) echo "found the -c option";;--) shift #發(fā)現(xiàn)破折號(hào),則選項(xiàng)列表結(jié)束,腳本將剩余參數(shù)作為參數(shù)而不是選項(xiàng)處理break;; #退出循環(huán)去處理剩余參數(shù)*) echo "no matching option";; # 默認(rèn)序列esac # case結(jié)束符shift # 將參數(shù)左移一個(gè)位置
done
(base) [user1@sysqa-h3c-b10 ~]$ ./1.sh -a -b 4 -d -c
found the -a option
found the -b option, param=4
no matching option
found the -c option
#!/bin/bash # 定義長(zhǎng)短選項(xiàng)
while [[ $# -gt 0 ]]; do case "$1" in -h|--help) echo "Usage: $0 [-o|--output=FILE] [-v|--verbose] [file...]" echo " -o, --output=FILE Specify output file" echo " -v, --verbose Enable verbose mode" echo " -h, --help Display this help message" exit 0 ;; -o|--output) shift # 跳過(guò)選項(xiàng)本身 output_file="$1" shift # 跳過(guò)值 ;; -v|--verbose) verbose_flag=true ;; --) # 結(jié)束選項(xiàng)解析 shift break ;; *) # 未知選項(xiàng) echo "Error: Unknown option $1" exit 1 ;; esac shift # 跳過(guò)當(dāng)前參數(shù)
done # 檢查是否提供了至少一個(gè)非選項(xiàng)參數(shù)
if [ $# -eq 0 ]; then echo "Error: No input files provided." echo "Usage: $0 [-o|--output=FILE] [-v|--verbose] [file...]" exit 1
fi # 處理非選項(xiàng)參數(shù)(這里簡(jiǎn)單打印出來(lái))
echo "Processing files:"
for file in "$@"; do echo " $file" # 在這里可以添加處理文件的代碼,例如使用cat, grep, sed等命令
done # 根據(jù)選項(xiàng)執(zhí)行相應(yīng)的操作
if [ -n "$output_file" ]; then echo "Output file specified: $output_file" # 在這里可以添加將處理結(jié)果寫(xiě)入文件的代碼
fi if $verbose_flag; then echo "Verbose mode is enabled." # 在這里可以添加冗余輸出的代碼
fi # 腳本結(jié)束
exit 0
重定向
標(biāo)準(zhǔn)輸入是鍵盤
輸入重定向符號(hào)為 < ,也就是輸入不再?gòu)逆I盤,而是從其他地方比如文件
標(biāo)準(zhǔn)輸出是顯示器
輸出重定向符號(hào)為 >, 也就是輸出不再到顯示器二十到其他地方比如文件
使用 >> 重定向輸出追加
標(biāo)準(zhǔn)錯(cuò)誤輸出
shell是將錯(cuò)誤消息與正常輸出分開(kāi)處理,所以如果發(fā)生錯(cuò)誤,還是會(huì)輸出到屏幕
ls badfile 2> a.txt
可以將標(biāo)準(zhǔn)錯(cuò)誤輸出到文件
數(shù)據(jù)和錯(cuò)誤同時(shí)輸出到一個(gè)文件
ls badfile &> a.txt
或者 2&>1
數(shù)據(jù)和錯(cuò)誤分別輸出
ls badfile 1> a.txt 2>b.txt
如果想把一個(gè)命令的輸出作為另一個(gè)命令的輸入,可以使用重定向
date > 1.log
sort < 1.log
但是需要兩條命令, 看起來(lái)有點(diǎn)笨拙。
使用管道符則可以直接完成這個(gè)功能
date | sort
顯示并且同時(shí)輸出到文件
tee命令
date | tee 1.txt
如果希望追加則加 -a
替換目錄下的所有文件中某個(gè)關(guān)鍵字
#!/bin/bash
# find path and replace all .c file keywords is "while" to "for"
find ./ -name "*.c" -exec sed -i 's/hip/mc/g' {} \;
刪除關(guān)鍵字所在行
find ./ -name "*.c" -exec sed -i '/load_json_helper/d' {} \;