명령을 인수로 전달하는 bash 스크립트

명령을 인수로 전달하는 bash 스크립트

선택은 스크립트를 실행할 때 제출된 매개변수를 기반으로 해야 합니다.

#!/bin/bash

#This script echoes a text and creates a file

echo "welcome. Will create a file with content in this folder"

ls -l | grep .txt > files_in_folder

답변1

스크립트 사용자가 파일 이름에 대한 파일 이름 접미사를 선택하려는 인수를 사용한다고 가정합니다 .txt.

#!/bin/sh

printf '%s\n' ./*"$1"

그러면 주어진 파일 이름 접미사로 끝나는 현재 디렉터리의 모든 이름이 나열됩니다. 이 printf명령은 쉘이 모드를 확장할 때(마지막에 사용자가 제공한 인수 포함) 목록을 생성한 다음 printf형식 문자열을 기반으로 한 줄에 각 목록 항목(이 경우 파일 이름)을 출력합니다. 여기에 사용된 형식 문자열은 %s\n"개행 문자가 뒤에 오는 문자열"을 의미하는 입니다.

ls -l다음을 사용하여 파일 메타데이터가 포함된 "긴 목록"을 얻으 시겠습니까 ?

#!/bin/sh

ls -ld ./*"$1"

-d이는 패턴과 일치하는 디렉터리의 내용이 나열되지 않도록 하기 위해 필요합니다 . 마찬가지로, 쉘은 주어진 패턴을 확장하고 ls -ld일치하는 파일 이름 목록을 사용하여 이를 호출합니다.

하위 디렉터리에 이름을 포함하려면 다음을 사용하세요 bash.

#!/bin/bash

shopt -s globstar
printf '%s\n' ./**/*"$1"

**이 옵션을 사용하여 패턴을 활성화하면 패턴이 하위 디렉터리에 반복적으로 일치됩니다 globstar. 분명히 위의 패턴을 사용할 수도 있지만 ls -ld패턴이 다음과 같이 확장되면 깨질 가능성이 있습니다.수천파일 이름.

목록을 다음으로 제한일반 파일(즉, 디렉토리 이름 등이 아니라 숨겨진 이름을 포함함) 하위 디렉토리로 이동하는 동안:

#!/bin/sh

find . -name "*$1" -type f

-ls출력과 유사한 내용이 필요한 경우 end 에 추가하세요 ls -ld.

이는 수천 개의 일치하는 파일 이름이 있는 경우에도 작동하지만 이제 매개 변수에 더 이상 파일 이름 와일드카드를 포함할 수 없습니다(예: 매개 변수를 플레이북으로 지정 .*하는 경우 ).'.*'

모든 경우에 $1인용해야 합니다. find명령 내에서 자체 패턴 일치와 마찬가지로 *따옴표로 묶어야 합니다 . 다른 경우에는 셸이 확장할 수 있도록 인용을 해제해야 합니다.find-name*

스크립트 내에서 또는 스크립트를 실행할 때(요구 사항의 일부인 경우) 출력을 파일로 리디렉션합니다.

위 스크립트의 모든 변형은 동일한 방식으로 호출됩니다.

./myscript.sh .txt

답변2

다음과 같이 사용할 수 있습니다. (스크립트에 전달된 매개변수의 모든 큰따옴표에 유의하세요)

#!/usr/bin/bash
first_cmd="$1"
second_cmd="$2"
$first_cmd | $second_cmd > outputfile.txt

구현하다:

$ ./temp.sh "ls -lrt" "grep '\.txt$'"

출력을 확인하십시오.

$ cat outputfile.txt 
***all the filename with .txt will print

관련 정보