㈠ shell腳本修改配置文件中內容,實現自動每次加1。求指導,不勝感謝!
#!/bin/bash
NUM=$(grep-oP'(?<=hello-)(d+)'$1)
sed-i"s/$NUM/$((NUM+1))/"$1
㈡ 在編寫shell腳本時,用什麼命令來修改配置文件,求解。越詳細越好,謝啦!
完全腳本修改不現實啊!一般的做法是提前定義好配置文件的內容,替換掉默認內的,容然後使用sed -i 『s/1/2/g』修改裡面的ip,打個比方說,nginx的配置文件,我所有的配置文件都一樣,然後用sed改掉裡面的域名和ip,和網頁根目錄。
㈢ shell腳本讀取配置文件
text1.txt文件如下
㈣ 啟動所有配置文件shell腳本怎麼寫
key=value 文本格式配置
而對於 linux shell,基本上很難使用前面提到的各種格式。所以在 unix 系統上,很多 shell 腳本的配置文件都是純粹的 key=value 文本格式,例如絕大多數的開機服務啟動腳本、網路配置文件等。
例子 1:ntp 配置文件
$ cat /etc/sysconfig/ntpd
# Drop root to id 'ntp:ntp' by default.
OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid"
# Set to 'yes' to sync hw clock after successful ntpdate
SYNC_HWCLOCK=no
# Additional options for ntpdate
NTPDATE_OPTIONS=""
例子 2:網路配置文件
$ cat /etc/sysconfig/network
NETWORKING="yes"
HOSTNAME="xx.com"
而且,要注意得是,一般 key=value 的等號兩邊不應該有空格,因為大多數腳本都是直接 source 配置文件的(當然,也有部分腳本是會自己處理配置文件格式),使用起來很簡單,基本上沒有解析的操作:
$ cat /etc/init.d/network
if [ ! -f /etc/sysconfig/network ]; then
exit 0
fi
. /etc/sysconfig/network
理所當然,這種格式無法滿足更復雜的配置文件需求,比如 ini 格式的 section。那麼,在 shell 中除了滿世界去找一個解析庫之外,能有什麼方法可以實現呢?
擴展 key=value 文本格式配置
假設,我們管理著 n 個集群,每個集群配置項都是一樣的,我們需要在 shell 腳本中,可以根據集群的名稱來導入對應的配置。
下面我們介紹一種最簡單的方法,只需要針對第一種格式擴展下即可。我們創建一個配置文件目錄 conf.d,在這個目錄下存放各個集群的配置文件。每個集群對應一個配置文件,文件名為集群名稱,例如:
$ cat conf.d/CLUSTER_A
c_cluster_name="CLUSTER_A"
c_cluster_type=1
在腳本中,我們可以這樣來導入相應集群的配置:
function load_config()
{
local cluster_name="$1"
if [ -f "conf.d/$cluster_name" ]; then
. conf.d/$cluster_name
fi
}
load_config CLUSTER_A
因為各個集群的配置文件相互獨立,所以如果包含一些全局范圍的配置項,需要在每個配置文件中都增加。或者,再增加一個入口的配置文件:
# cat global.conf
g_conf_dir=conf.d # 配置文件目錄
g_version="0.1" # 全局配置
腳本相應調整下:
GLOBAL_CONF=/etc/xxx/global.conf
if [ -f "$GLOBAL_CONF" ]; then
. $GLOBAL_CONF
fi
if [[ "$g_conf_dir" != /* ]]; then # 如果是相對路徑
g_conf_dir="$(dirname $GLOBAL_CONF)/$g_conf_dir"
fi
function load_config()
{
local cluster_name="$1"
if [ -f "$g_conf_dir/$cluster_name" ]; then
. $g_conf_dir/$cluster_name
fi
}
load_config CLUSTER_A
類 ini 配置格式
第二種方法,基本上已經可以解決我們之前假設中提出的需求,簡單而且實現方便,不足的是配置文件比較零散,管理上可能不是很方便。如果,你仍然傾向於一種類似 ini 格式的配置,可以試試下面這種方法。
在這種場景下,每個集群應該是一個獨立的 section,所以轉換成 ini 格式,配置文件應該是這樣的:
[DEFAULT]
g_version="0.1" ; 全局配置
[CLUSTER_A]
c_cluster_name="CLUSTER_A"
c_cluster_type=1
但是,我們前面提到過,原生的 shell 是很難去解析 ini 格式的配置文件的,所以上面的形式還得變化下,我們用 shell 中的函數來模擬 section:
$ cat cluster.conf
# global config
g_version="0.1" # 全局配置
function section_cluster_a()
{
c_cluster_name="CLUSTER_A"
c_cluster_type=1
}
function section_cluster_b()
{
c_cluster_name="CLUSTER_B"
c_cluster_type=1
}
配套的配置文件解析庫:
$ cat config.sh
#!/bin/echo Warnning, this library must only be sourced!
if [ ! -f "cluster.conf" ]; then
exit 0 # or print error before exit
fi
. cluster.conf
function load_config()
{
local cluster_name=$(echo "$1" | tr A-Z.- a-z__) # 特殊符號轉換
section_$cluster_name &>/dev/null # 執行函數,將集群的配置賦值給對應的全局變數
}
function option()
{
local opt_name="$1"
if [[ "$opt_name" != c_* ]]; then # no "c_" prefix
opt_name="c_$opt_name"
fi
echo "${!opt_name}" # indirect reference by variable name
}
㈤ shell腳本中,我要在配置文件寫入東西,但是截取的內容可能沒有,我想如果沒有填入其他的東西
A=`awk ......`
如果是空,就賦值你想填入的其他東西
if [ -z $A ];then
A='123.123.123.123'
fi
㈥ 標準的shell腳本應該包含什麼
一個標準的shell腳本包括bin、conf、log三個文件夾。bin包含腳本的具體內容;conf包含腳本需要獲取的配置;log包含腳本執行過程有無錯誤的log和跟業務相關的log。在計算機科學中,Shell俗稱殼,是指「為使用者提供操作界面」的軟體(命令解析器)。它用於接收用戶命令,然後調用相應的應用程序。同時它又是一種程序設計語言。作為命令語言,它互動式解釋和執行用戶輸入的命令或者自動地解釋和執行預先設定好的一連串的命令;作為程序設計語言,它定義了各種變數和參數,並提供了許多在高級語言中才具有的控制結構,包括循環和分支。在排序演算法中,Shell是希爾排序的名稱。
㈦ shell腳本執行中如何自動讀取需要配置的文件
假如你的install.sh腳本中執行到某一句等待人工輸入配置信息,這樣的語句可能是
read var
意思是阻塞等待標准輸入,將輸入的內容賦值給var這個變數,接下來就根據var變數的內容進行後續安裝操作;
那麼只要將這行命令改成 var=`cat file` 也就是讀取預先准備的文件內容即可,此時var不是手動輸入的內容了。接下來的操作仍然是根據var變數的值安裝