我有一個a.md檔案:
Start file
```
replace content here by a variable or result of a command such as pwd,
the whole content in this code block should be something like /Users/danny/MyProjects/CurrentDir
```
End file
update.sh以及用于更新上述檔案的腳本:
#!/bin/sh
t=$(pwd)
echo $t
perl -i -p0e 's/(?<=```shell\n)[\s\S]*(?=\n```)/$t/s' a.md
它適用于字串,但我不能用變數替換,例如$(pwd).
uj5u.com熱心網友回復:
該 shell 腳本中的 Perl 命令列程式不能使用腳本中的變數,但我們需要以某種方式將變數傳遞給它。
有幾種方法可以做到這一點,?也許在這里使用-sswitch是最簡單的
#!/bin/bash
t=$(pwd)
echo $t
perl -i -0777 -s -pe's/(?<=```shell\n)[\s\S]*(?=\n```)/$d/s' -- -d="$t" a.md
# or
# perl -i -0777 -s -pe'...' -- -d="$(pwd)" a.md
-sfor perl 為程式本身啟用了對開關的基本支持。
這樣-d=...就可以$d在程式中使用,或者使用分配的值,這里是 bash 變數的值$t,或者1如果沒有分配 ( -d)。我們可以通過這種方式傳遞多個變數,每個變數都在自己的開關中。
程式后標記引數的--開始。
我們不需要 shell 變數,但可以直接使用命令輸出,-var="$(pwd)".
?除了使用存盤(檔案、資料庫等)或管道之外,還有另外兩種方法可以直接傳遞給這個命令列(“單線”)程式的引數
將變數作為引數傳遞并從
@ARGV程式中讀取t=$(pwd) perl -i -0777 -s -pe'BEGIN { $d = shift }; s/.../$d/s' "$t" a.md我們還需要從中洗掉它,
@ARGV以便隨后可以處理檔案,這就是shift所做的,并且需要在一個BEGIN塊中執行此操作,因為-p設定了一個回圈。在 bash 中匯出一個變數,使其成為環境變數,然后 Perl 腳本可以通過
%ENV變數使用它export t=$(pwd) perl -i -0777 -s -pe's/.../$ENV{t}/s' a.md注意,它
t在%ENV哈希($ENV{t})中,是變數的名稱,而不是$t(值)
參見例如這篇文章和這篇文章
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/512835.html
標籤:壳perl
