이 질문은 나와 관련이 있습니다.이전 질문.
이것은 다음의 출력입니다 tree
.
[xyz@localhost Semester1]$ tree
.
├── Eng
│ ├── credits
│ ├── links
│ └── notes
├── IT
│ ├── credits
│ ├── links
│ └── notes
├── IT_workshop
│ ├── credits
│ ├── links
│ └── notes
├── LA
│ ├── credits
│ ├── links
│ └── notes
├── OS
│ ├── credits
│ ├── links
│ └── notes
├── OS_lab
│ ├── credits
│ ├── links
│ └── notes
├── Psy
│ ├── credits
│ ├── links
│ └── notes
├── Python
│ ├── credits
│ ├── links
│ └── notes
└── Python_lab
├── credits
├── links
└── notes
9 directories, 27 files
이제 해당 폴더의 학점 파일에서 각 과정에 사용된 학점 수를 언급하고 싶습니다 cat
.
예를 들어, 강좌당 학점 수는 다음과 같습니다.
코스 이름 | 생산 직원 |
---|---|
잉게 | 2 |
로스 앤젤레스 | 삼 |
파이썬 | 삼 |
운영 체제 | 삼 |
그것 | 삼 |
IT_워크샵 | 1 |
파이썬 연구실 | 1 |
운영체제 연구실 | 1 |
심리학 | 2 |
Eng/credits에 크레딧 세부정보를 추가하려면 다음 명령을 실행해야 합니다.
cat >> Eng/credits
크레딧 수(예: 2)를 입력하고 Ctrl+를 누릅니다 D.
나머지 8개 파일에 대해서도 동일한 단계를 수행해야 하는데 이는 지루한 작업처럼 보입니다. 한 번에 이 모든 작업을 수행할 수 있는 방법이 있나요 cat
?
Bash를 아는 몇몇 친구들과 이야기를 나눴는데 제 경우에는 echo
or 를 사용하는 것이 더 낫다고 하더군요 printf
. 왜 이런 일이 발생합니까?
나는 이것을 하려고 합니다:
- Eng/credits 파일에 숫자 2를 기록하고 싶습니다.
- LA/크레딧 파일에 숫자 3을 기록하고 싶습니다.
- Python/credits 파일에 숫자 3을 기록하고 싶습니다.
- OS/크레딧 파일에 숫자 3을 기록하고 싶습니다.
- IT/크레딧 파일에 숫자 3을 기록하고 싶습니다.
- IT_workshop/credits 파일에 숫자 1을 쓰고 싶습니다.
- Python_lab/credits 파일에 숫자 1을 쓰고 싶습니다.
- OS_lab/credits 파일에 숫자 1을 쓰고 싶습니다.
- Psy/credits 파일에 숫자 2를 쓰고 싶습니다.
echo {2,3,3,3,3,1,1,1,2} >> {Eng/credits,LA/credits,Python/credits,OS/credits,IT/credits,IT_workshop/credits,Python_lab/credits,OS_lab/credits,Psy/credits}
하지만 예상대로 작동하지 않습니다.
bash: {Eng/credits,LA/credits,Python/credits,OS/credits,IT/credits,IT_workshop/credits,Python_lab/credits,OS_lab/credits,Psy/credits}: ambiguous redirect
답변1
Cat은 전체 파일을 출력하는 데 사용됩니다. 피연산자(옵션이 아닌 인수)는 파일입니다. 이렇게 하면 cat >> foo
stdout 파일을 foo
.
echo 및 printf는 즉시 데이터를 얻습니다.
echo 2 >> foo
...파일에 2를 넣으세요 foo
.
Printf는 사물에 서식을 추가하고, 표준화하고, 알 수 없는 데이터에 직면했을 때 잠재적으로 더 안전할 수 있는 방법을 제공합니다.
답변2
질문에 표시된 수동 방법보다 더 간단한 방법으로는 cat을 사용하여 이 작업을 수행할 수 없을 것입니다. 이 시도:
while read course credit; do
echo $credit >> $course/credits
done <<EOF
Eng 2
LA 3
Python 3
OS 3
IT 3
IT_workshop 1
Python_lab 1
OS_lab 1
Psy 2
EOF
~에서배쉬 매뉴얼 페이지:
read
[-ers]
[-a aname]
[-d delim]
[-i text]
[-n nchars]
[-N nchars]
[-p prompt]
[-t timeout]
[-u fd]
[name ...]
표준 입력 또는 파일 설명자에서 한 줄 읽기
fd
매개변수로 제공-u
위에서 설명한 대로 단어로 구분된 옵션분사, 첫 번째 단어가 첫 번째 단어에 할당됩니다.name
, 두 번째 단어에서 두 번째 단어로name
, 등. 이름보다 단어가 많은 경우 나머지 단어와 중간 구분 기호는 마지막 단어에 할당됩니다.name
. 입력 스트림에서 이름보다 적은 단어를 읽는 경우 나머지 이름에는 null 값이 할당됩니다. 문자IFS
확장을 위해 쉘을 사용하여 행을 단어로 분할하는 데에도 동일한 규칙을 사용하십시오(위에서 설명한 대로). 분사). 백슬래시 문자(\
)은 다음 문자 읽기 및 줄 연속의 특별한 의미를 제거하는 데 사용할 수 있습니다. 옵션이 제공되는 경우 다음과 같은 의미를 갖습니다:
︙
이 read course credit
명령은 각 줄의 첫 번째 단어를 변수에 할당한 course
다음 줄의 나머지 부분(이 경우 숫자)을 할당합니다 credit
.
또한 매뉴얼 페이지에서:
여기에 파일
이러한 유형의 리디렉션은 행에 다음 항목만 포함될 때까지 현재 소스에서 입력을 읽도록 쉘에 지시합니다.
delimiter
(후행 공백 없음) 표시됩니다. 해당 지점까지 읽은 모든 줄은 표준 입력(또는 파일 설명자)으로 사용됩니다.n
만약에n
지정)을 명령으로 사용합니다.이 문서의 형식은 다음과 같습니다.
[N]<<[-]단어 여기 문서 구분 기호
이 경우 "word"와 "delimiter"는 EOF
"document here"가 데이터입니다. <<EOF
모든 것을 데이터가 포함된 파일로 바꾸고 여기에서 표준 입력을 리디렉션할 수 있습니다 .<data.txt