タイトルが自明だと思います。パラメータとして与えられたいくつかのファイルがあり、与えられた文字列は私のスクリプトの最後のパラメータです。以下の両方のスクリプトを試しましたが、両方を機能させる方法がわかりません。 sedコマンドで検索するパターン(文字列)を指定する両方のスクリプトで、一部の「\」文字が欠落しているようです。
#!/bin/bash
a=${@: -1} # get last parameter into a variable
or ((i=1; i<$#; i++)) # for each parameter, except the last one
do
sed -i '1,30{/$a/d}' "${!i}" # delete each line in the i-th file, in range 1-30
# containing $a (last given parameter)
done
2回目の試み:
#!/bin/bash
a=${@: -1} # get last parameter into a variable
for file in "${@:1:$# - 1}"
do
sed -i '1,30{/$a/d}' $file
done
答え1
私の問題は、二重引用符ではなく一重引用符を使用することです。変数拡張不可能。
以下は、@guillermo chamorroが要求した入力ファイルと出力ファイル、および端末からスクリプトを呼び出す例と一緒に2つの作業スクリプトです(ここで「call」という単語を正しく使用しているかどうかはわかりません。「using」と仮定します)。 :
ファイル1(ファイル2同じ内容があります)
Out of the first 30 lines of this file I will be deleting only those that contain
the character substring given as a parameter.
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
30
31
32
33
...
and so on
function_shell_1
#!/bin/bash
a=${@: -1} # store last argument in a variable
#part of the for-loop line is commented because of the first hashtag character
for ((i=1; i<$#; i++)) # consider all arguments, but the last one
do
sed -i "1,30{/$a/d}" "${!i}"
# for each i-th line among the first 30 lines, do in-place deletions
#(-i dictates the in-place part) of each one containing the value of the
# a variable
done
function_shell_2(forループへのマイナーな変更のみ)
#!/bin/bash
a=${@: -1} # store last argument in a variable
for fisier in "${@:1:$# - 1}" # consider all arguments, but the last one
do
sed -i "1,30{/$a/d}" $fisier
# for each i-th line among the first 30 lines, do in-place deletions
#(-i dictates the in-place part) of each one containing the value of the
# a variable
done
スクリプトコマンドの例:
./function_shell_1 file1 file2 '2'
#./function_shell_2 file1 file2 '2'
上記の両方はまったく同じように動作し、両方とも同じ予想変更を生成します。ファイル1そしてファイル2、つまり:
Out of the first 30 lines of this file I will be deleting only those that contain
the character substring given as a parameter.
3
4
5
6
7
8
9
10
11
13
14
15
16
17
18
19
31
32
33
...
and so on