大家好。我對 bash 幾乎沒有經驗,但在寫到這里之前,我閱讀了我發現的所有內容。我有一個帶有行的文本檔案:
disk1
disk2
disk3
該檔案是命令的結果:
disk list | awk -F"|" '/backup/ {print $3}' | sed s/' '//g > backupdisks.txt
如果我們可以擺脫它,輸出命令并立即將命令轉換為變數,那就更酷了。行數會不時改變。我需要在 bash 腳本中獲取這些行并將它們插入
snapshot create --name ${disk}-$now --disk-name ${disk}
我不明白如何將每一行匯入變數 disk1 , disk2... 然后將它們替換為第二個命令。我閱讀并嘗試過
while read -r disk
do
echo "${disk}"
done < backupdisks.txt
并且:
read var2 var3 <data-file
echo "var2 = $var2 var3 = $var3"
并且
file=text.txt
while IFS= read -r line
do
# echo line is stored in $line
echo $line
done < "$file"
我想我無法弄清楚這是如何作業的。
Коллегибожественно。Благодаря вашим ответам я начинаю понимать, как это работает。Я вставлю сюда весь скрипт, потому что он может пригодиться всем, кто работает в Яндекс Облаке (резервной копи нет(()
Пытаюсь сделать трехдневные бэкапы всех дисков, которые начинаются с бэкапа Вот что у меня получилось и работает:
#!/bin/bash
getDate() {
date ' %d%m%Y'
}
getDate1() {
date ' %d%m%Y' --date='3 days ago'
}
now=$(getDate)
del=$(getDate1)
for disk in `yc compute disk list --folder-id "id вашей папки" | awk -F"|" '/backup/ {print $3}' | sed s/' '//g`
do
(
yc compute snapshot create --folder-id "id вашей папки" --name ${disk}-$now --disk-name ${disk} &&\
yc compute snapshot delete --folder-id "id вашей папки" --name ${disk}-$del
) & disown
done
uj5u.com熱心網友回復:
最初的問題是如何傳遞變數。
我的回答實際上并沒有解決 OP 問題,而是為他們試圖做的事情提供了另一種方法。我還將在替代方法下方給出原始問題的答案
解決問題的替代方法
disk list | awk -F"|" '/backup/ { print "now=$(date \047 %Y-%m-%dT%H:%M:%S\047) snapshot create --name " $3 "-$now --disk-name " $3 }'
這樣您將獲得輸出:
now=$(date ' %Y-%m-%dT%H:%M:%S') snapshot create --name disk1-$now --disk-name disk1
now=$(date ' %Y-%m-%dT%H:%M:%S') snapshot create --name disk2-$now --disk-name disk2
now=$(date ' %Y-%m-%dT%H:%M:%S') snapshot create --name disk3-$now --disk-name disk3
這又可以通過管道傳輸到 bash 以實際運行它。
所以最后:
disk list | awk -F"|" '/backup/ {print "now=$(date \047 %Y-%m-%dT%H:%M:%S\047) snapshot create --name " $3 "-$now --disk-name " $3 }' | bash
重要的提示
我的代碼中幾乎沒有錯誤檢查。對于生產代碼,很好地測驗這種型別的東西總是一個好主意。例如,我們假設disk list命令每次都正確輸出正確的串列等。
關于 $now 的注意事項
如果要為所有磁盤保留相同的時間戳,則可以將其作為回顯放在 awk 的 BEGIN 塊中:
disk list | awk -F"|" 'BEGIN { print "export now=\047$(date %Y-%m-%dT%H:%M:%S)\047 " } /backup/ {print "snapshot create --name " $3 "-$now --disk-name " $3 }'
這導致輸出:
export now='$(date %Y-%m-%dT%H:%M:%S)';
snapshot create --name disk1-$now --disk-name disk1
snapshot create --name disk2-$now --disk-name disk2
snapshot create --name disk3-$now --disk-name disk3
您可以調整日期的值,或者以您喜歡的方式獲得“現在”。
我希望這能給你一個起點。
傳遞變數
假設我的替代方法對于一般問題無效,transferring variables那么我們可以這樣處理它:
因此,假設我們有一個串列,我們想一次分配給 bash 中的一個變數,但我們想保留該結果,然后在其他地方使用該結果:
cat file | while read line ; do
do_something_with $line
done
但我們可以更進一步:
cat file | while read line ; do
construct_another_command_with $line
done | command_processor
一個示例是創建 shell 腳本的行,就像我在當時的 ALTERNATIVE APPROACH 中所做的那樣,創建一組bash可以理解為腳本的行,然后將這些行通過管道傳遞bash給執行它們。
uj5u.com熱心網友回復:
如果每行只有一個變數,那就xargs太好了:
disk list \
| awk -F"|" '/backup/ {print $3}' \
| sed s/' '//g \
| xargs -I '{}' snapshot create --name {}-$now --disk-name {}
-I '{}'告訴用它從檔案中讀取的行xargs替換字串。{}請注意,$now它不會被 xargs 替換,而是被常規 shell 替換。
對于更通用的答案,其中行可以包含多個引數引數,那么您可以使用while read決議(此處的真實示例):
disk list \
| awk -F"|" '/backup/ {print $3}' \
| sed s/' '//g \
| awk '{ print systime() " " $0 }' \
| while read now disk; do \
snapshot create --name "${disk}-${now}" --disk-name "${disk}"
done
這awk '{ print systime() " " $0 }'會將當前時間戳(用作${now})添加到您的普通行(用作${disk})。
所以每一行看起來像這樣:
1653864092 /backup/disk1
1653864092 /backup/disk2
1653864092 /backup/disk3
即,每行 2 個變數。
然后,我們使用read讀取 2 個變數并在命令中使用它們,就像在常規 shell 中一樣,非常類似于 @Ahmed Masud 的“TRANSFERRING VARIABLES”答案。
uj5u.com熱心網友回復:
沒有對此進行測驗,但我認為您可以為此使用 subshel??l,如下所示:
for disk in $(disk list | awk -F"|" '/backup/ {print $3}' | sed s/' '//g); do snapshot create --name ${disk}-$now --disk-name ${disk}; done
不要忘記$now在運行這個回圈之前定義。
uj5u.com熱心網友回復:
同事是神圣的。感謝您的回答,我開始了解它是如何作業的。我將整個腳本粘貼到這里,因為它對在 Yandex Cloud 中作業的每個人都有用(沒有備份副本 ((( )
我正在嘗試對所有以備份開頭的磁盤進行為期三天的備份 這是我得到的并且它有效:
#!/bin/bash
getDate() {
date ' %d%m%Y'
}
getDate1() {
date ' %d%m%Y' --date='3 days ago'
}
now=$(getDate)
del=$(getDate1)
for disk in `yc compute disk list --folder-id "id вашей папки" | awk -F"|" '/backup/ {print $3}' | sed s/' '//g`
do
(
yc compute snapshot create --folder-id "id вашей папки" --name ${disk}-$now --disk-name ${disk} &&\
yc compute snapshot delete --folder-id "id вашей папки" --name ${disk}-$del
) & disown
done
是否可以在所有磁盤上并行運行?)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/483475.html
標籤:重击
