쉘스크립트 변수 내 변수

익명 사용자의 이미지

쉘스크립트에서 변수를 지정하려고 하는데 오류가 나옵니다.

#!/bin/bash
 
abc_1=102
xyz_1=652
abc_2=8
xyz_2=785
abc_3=583
xyz_3=310
 
for i in {1..3}
do
	echo "xyz_$i - abc_$i equal $(($xyz_$i - $abc_$i))"
done

라는 코딩을 짰습니다.

제가 하고자 했던 것은

xyz_1 - abc_1 equal 계산값
xyz_2 - abc_2 equal 계산값
xyz_3 - abc_3 equal 계산값

가 출력되게 하고 싶었지만 계산값이 전부 0으로 나왔습니다.
아무래도 $xyz_$i와 $abc_$i를 인식 못하는 것 같은데 어떻게 해야하나요?

ymir의 이미지

eval echo "xyz_$i - abc_$i equal \$((\$xyz_$i - \$abc_$i))"

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

익명 사용자의 이미지

제가 질문을 살짝 잘못 쓴 것 같습니다.
xyz_$i와 abc_$i도 변수로 보고 싶다면 어떻게 해야할까요?
또한

abc_$i=$(grep '$abc_$i' cal.txt | wc-l)

와 같은 변수 지정도 eval 로 해결이 가능할까요?
chanik의 이미지

질문을 잘못 쓰셨다기엔 최초 질문이 명확해 보이고,
아마 답글을 보고 추가로 궁금하신 점이 생긴 것 같습니다.

$abc_1 같은 변수의 값을 파일에서 찾아 그 갯수를 같은 이름의 변수에 저장하는 식인가요?
동적으로 이름이 정해지는 변수이므로 참조할때와 할당할때 모두 eval로 따로 감싸야겠네요.

eval abc_$i=$(eval grep \$abc_$i cal.txt | wc -l)

그리고, grep '$abc_$i' 식으로 single quote를 쓰시면 변수확장이 일어나지 않으므로, $abc_1 같은 변수의 값을 찾는게 아니라 '$abc_$i'라는 문자열 자체를 찾게 됩니다. 정확히 뭘 하시려는지는 모르겠으나, 조금 실험해보시고 목적에 맞게 쓰시면 되겠습니다.

익명 사용자의 이미지

감사드립니다.
주신 코드가 바로 제가 원하던 코드였습니다. 덕분에 해결했습니다.

익명 사용자의 이미지

안녕하세요. 구글서치로 eval에 대해서 배우려 했으나 해결이 되지 않아 추가 질문을 드립니다.
제가 실제 작성하고 있는 스크립트 중 일부를 약간 간략화 하여 아래 첨부하였습니다.
우선 여기서 문제가 > eval \$a_${i} 부분이 안되는 점. (eval이라는 파일을 만들더군요...)
그 외에도 변수 구현이 안되고 있는지 궁금하여 스크립트 파일을 올립니다.
감사합니다.

댓글 첨부 파일: 
첨부파일 크기
Plain text icon ee.txt781바이트
ymir의 이미지

eval 은 뒤따라 나오는 문자열을 '평가' 한 후에, '실행' 해주는 명령입니다.
eval 뒤에 실행 가능한 명령이 나오지 않으면 쓸모 없죠.

> 뒤에는 file 이 와야합니다.
따라서, '> eval ..' 은 eval 이라는 file 로 redirection 되죠.

그리고 뭔가 잘 안 된다 싶으면, 한 번에 많은 걸 하려 하지 말고, 최대한 쪼개서 해보세요.
미리 다른 변수에 원하는 파일명을 저장한 후에, > 뒤에 그 변수를 적었더라면..
잘은 몰랐더라도 문제를 피해갈 수 있었을 겁니다.

$ abc_1=foo
$ echo a > foo
$ cat foo
a
$ \rm foo
$ echo a > $(echo foo)
$ cat foo
a
$ \rm foo
$ echo a > $(echo $abc_1)
$ cat foo
a
$ \rm foo
$ i=1
$ echo a > $(eval echo \$abc_$i)
$ cat foo
a
$ \rm foo
$ eval bar=\$abc_$i
$ echo a > $bar
$ cat foo
a

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

익명 사용자의 이미지

감사합니다. 해결됐습니다.

익명 사용자의 이미지

echo "xyz_$i + abc_$i equal $((xyz_$i + abc_$i))"

chanik의 이미지

https://kldp.org/comment/638767#comment-638767 참조하여 아래와 같이 하실 수도 있습니다.

for i in {1..3}
do
  a=abc_$i x=xyz_$i
  echo "$x - $a equal $((${!x} - ${!a}))"
done

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.