我試圖運行下面的腳本,讓我們從比它的工作目錄以外的其他位置調用它foo.sh
:試圖運行來自不同位置的shell腳本,但錯誤說我試圖創建一個目錄
var1="$1"
var2="$2"
for SNR_NR in $var1; do
for parts in $var2; do
# echo *-$SNR_NR-$parts
for file in *-$SNR_NR-$parts; do
cat "$file" | sed -n '3p' \
| sed 's/$/,/' >> tmp
cat "$file" | sed -n '4p' \
| tr ' ' ',' \
| sed 's/^.\(.*\).$/\1/' >> tmp
done
done
# Concatenate the above onto one line
paste -d " " - - < tmp
rm tmp
done
它很簡單,它從工作目錄運行得非常好,因爲它使用兩個數字整數參數。
現在,如果我嘗試從比工作目錄之外的其他地方運行它,我得到的錯誤是:
/data/RESULTS/foo.sh: 18: /data/RESULTS/foo.sh: cannot create tmp: Is a directory
cat: *-0-500: No such file or directory
/data/RESULTS/foo.sh: 22: /data/RESULTS/foo.sh: cannot create tmp: Is a directory
cat: *-0-500: No such file or directory
paste: -: Is a directory
paste: -: Is a directory
rm: cannot remove ‘tmp’: Is a directory
我曾嘗試加入我的工作目錄到$PATH
,但它仍然無法正常工作。運行ls -la on foo.sh
給出-rw-------
但是做chmod +x foo.sh
仍然不起作用。
最奇怪的部分是,它試圖創建一個名爲tmp
的目錄,我不太明白,因爲它只是一個臨時文件來存儲一些中間結果,然後將其打印到shell。
編輯:
將船上的建議,從意見後,以下現在生產這個錯誤,而不是,這是一種進步:
:var1="$1"
var2="$2"
for SNR_NR in $var1; do
for parts in $var2; do
# echo *-$SNR_NR-$parts
for file in *-$SNR_NR-$parts; do
cat "$file" | sed -n '3p' \
| sed 's/$/,/' >> brian
cat "$file" | sed -n '4p' \
| tr ' ' ',' \
| sed 's/^.\(.*\).$/\1/' >> brian
done
done
# Concatenate the above onto one line
paste -d " " - - < brian
rm brian
done
與sh foo.sh 5 500
運行結果
cat: *-0-500: No such file or directory
cat: *-0-500: No such file or directory
SOLUTION:
一個簡單的重寫產生
var1="$1"
var2="$2"
# Supply results/script directory as argument
var3 = "$3"
# cd into script directory before running it
cd $var3
for SNR_NR in $var1; do
for parts in $var2; do
# echo *-$SNR_NR-$parts
for file in *-$SNR_NR-$parts; do
cat "$file" | sed -n '3p' \
| sed 's/$/,/' >> brian
cat "$file" | sed -n '4p' \
| tr ' ' ',' \
| sed 's/^.\(.*\).$/\1/' >> brian
done
done
# Concatenate the above onto one line
paste -d " " - - < brian
rm brian
done
這是可怕的。整個內部循環應該是一個單獨的'sed'腳本;像'sed -n'3s/$ /,/ p; !4D; y//,/; S/^ \ $/\ 1/P。(* \。)。 q'「$ file」'除了註釋。 – tripleee
對,原始文件有四行,我想要最後兩行。在它們的原始版本中,它們看起來像'-97669.26212165842 \ n (0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)',我希望它們在一個像這樣的'-97669。26212165842,0,0,0,0,0,0,..,0,0'。 (0 0 0 ... 0 0 0)的每一行都有1000個條目,但爲了演示,我添加了「...」。無論如何,你的腳本不起作用; 'sed:-e表達式#1,字符12:未知命令:4'' – Astrid
對不起,應該是'4!d'而不是'!4d'。主要的一點是,當人們輕易做到的時候,使用六個流程是相當浪費的。 'sed'並不是特別容易閱讀(或者寫,呵呵),但是你的任務聽起來像是Awk的簡單單線程。 – tripleee