나는 제목이 자명하다고 생각합니다. 매개변수로 주어진 일부 파일이 있고 주어진 문자열은 내 스크립트의 마지막 매개변수입니다. 아래 두 스크립트를 모두 시도했지만 둘 다 작동하게 만드는 방법을 모르겠습니다. 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
두 번째 시도:
#!/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가 요청한 입력 및 출력 파일과 터미널에서 스크립트를 호출하는 예와 함께 두 개의 작업 스크립트입니다(여기서 "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