Bash හි විධානයක ප්‍රතිදානයට විචල්‍යයක් සකසන්නේ කෙසේද?


1710

මා සතුව ඉතා සරල පිටපතක් ඇත, එය පහත දැක්වෙන දේට සමාන ය:

#!/bin/bash

VAR1="$1"
MOREF='sudo run command against $VAR1 | grep name | cut -c7-'

echo $MOREF

මම මෙම ස්ක්‍රිප්ට් විධාන රේඛාවෙන් ධාවනය කර එය තර්ක ඉදිරිපත් කරන විට, මට කිසිදු ප්‍රතිදානයක් නොලැබේ. කෙසේ වෙතත්, මම $MOREFවිචල්යයේ අඩංගු විධාන ක්රියාත්මක කරන විට , මට ප්රතිදානය ලබා ගත හැකිය.

ස්ක්‍රිප්ට් එකක් තුළ ක්‍රියාත්මක කිරීමට අවශ්‍ය විධානයක ප්‍රති results ල ලබාගෙන එය විචල්‍යයකට සුරකින්න, ඉන්පසු එම විචල්‍යය තිරය මත ප්‍රතිදානය කරන්නේ කෙසේද?


1
අදාළ ප්‍රශ්නයක් stackoverflow.com/questions/25116521/…
නාත්

40
අනෙක් අතට, සියළුම කැප් විචල්‍යයන් POSIX විසින් මෙහෙයුම් පද්ධතියට හෝ ෂෙල් එකට අර්ථයක් ඇති විචල්‍ය නම් සඳහා අර්ථ දක්වා ඇති අතර අවම වශයෙන් එක් කුඩා අකුරු සහිත නම් යෙදුම් භාවිතය සඳහා වෙන් කර ඇත. මේ අනුව, අනපේක්ෂිත ගැටුම් වලක්වා ගැනීම සඳහා ඔබේම ෂෙල් විචල්‍යයන් සඳහා කුඩා අකුරු භාවිතා කිරීම සලකා බලන්න (ෂෙල් විචල්‍යයක් සැකසීම ඕනෑම සමාන පරිසර විචල්‍යයක් නැවත ලියනු ඇති බව මතක තබා ගන්න).
චාල්ස් ඩෆි

1
ක පසෙකට, විචල්ය බවට ප්රතිදානය අල්ලා ඉතින් ඔබට හැකි නම් ලෙස echoවිචල්ය යනු ඇති පලක් භාවිතය echo, හා වැඩකට නැති භාවිතය විචල්යයන්.
ත්‍රිත්ව

1
තව දුරටත්, විචල්යයන්හි ප්රතිදානය ගබඩා කිරීම බොහෝ විට අනවශ්ය වේ. කුඩා, කෙටි නූල් සඳහා ඔබේ වැඩසටහනේ කිහිප වතාවක්ම සඳහන් කිරීමට අවශ්‍ය වනු ඇත, මෙය සම්පූර්ණයෙන්ම හොඳයි, හරියටම යා යුතු මාර්ගය; නමුත් කිසියම් අත්‍යවශ්‍ය දත්ත ප්‍රමාණයක් සැකසීම සඳහා, ඔබේ ක්‍රියාවලිය නල මාර්ගයකට නැවත සකස් කිරීමට හෝ තාවකාලික ගොනුවක් භාවිතා කිරීමට ඔබට අවශ්‍යය.
ත්‍රිත්ව

Answers:


2419

බැක්ටික්ස් වලට අමතරව `command`, විධාන ආදේශ කිරීම $(command)හෝ "$(command)"මට කියවීමට පහසු වන අතර කැදැල්ලට ඉඩ සලසයි.

OUTPUT=$(ls -1)
echo "${OUTPUT}"

MULTILINE=$(ls \
   -1)
echo "${MULTILINE}"

( ") උපුටා දැක්වීම බහු-රේඛීය විචල්‍ය අගයන් ආරක්ෂා කිරීමට වැදගත් වේ ; එය, පැවරුමක් දකුණු-අත පැත්තේ විකල්ප වේ වචනය පැලෙන සිදු නොවේ , ඒ නිසා OUTPUT=$(ls -1)හොදින් ක්රියාත්මක වනු ඇත.


61
බහු රේඛා ප්‍රතිදානය සඳහා අපට යම් බෙදුම්කරුවෙකු සැපයිය හැකිද?
ආර්යන්

20
සුදු අවකාශය (හෝ හිස් අවකාශය නොමැතිකම) කාරණා
අලි

8
@ timhc22, කැරලි වරහන් අදාල නොවේ; එය වැදගත් වන්නේ නැවත උපුටා දැක්වීම් පමණි: echoවිධාන වෙත යැවීමට පෙර පුළුල් කිරීමේ ප්‍රති results ල නූල් බෙදී ගොස් ගෝලීයව පුළුල් වී තිබේද යන්න .
චාල්ස් ඩෆි

4
ස්තූතියි! ඉතින් රැලි සහිත වරහන් වලින් යම් ප්‍රයෝජනයක් තිබේද?
timhc22

14
විචල්යය ක්ෂණිකව අනුගමනය කරන විට වක්රය වරහන් භාවිතා කළ හැකි අතර විචල්ය නාමයේ කොටසක් ලෙස අර්ථ දැක්විය හැකිය. උදා ${OUTPUT}foo . විචල්යය මත පේළිගත කිරීමේ මෙහෙයුම් සිදු කිරීමේදී ඒවා ද අවශ්‍ය වේ, එනම්${OUTPUT/foo/bar}
පොහොසත් රිමර්

286

නිවැරදි මාර්ගයයි

$(sudo run command)

ඔබ අපෝස්තලයක් භාවිතා කිරීමට යන්නේ නම්, ඔබට අවශ්‍යය `, නැත '. මෙම චරිතය "බැක්ටික්ස්" (හෝ "බරපතල උච්චාරණය") ලෙස හැඳින්වේ.

මෙවැනි:

#!/bin/bash

VAR1="$1"
VAR2="$2"

MOREF=`sudo run command against "$VAR1" | grep name | cut -c7-`

echo "$MOREF"

32
බැක්ටික් වාක්‍ය ඛණ්ඩය යල්පැන ඇති අතර විචල්‍ය අන්තර් මැදිහත්වීම වටා ද්විත්ව උපුටා දැක්වීම් කළ යුතුය echo.
ත්‍රිත්ව

10
ඉහත පැවරුමේ '=' අවට ඇති අවකාශයන් සමඟ ඔබ ප්‍රවේශම් විය යුතු බව මම එකතු කරමි. ඔබට එහි කිසිදු ඉඩක් නොතිබිය යුතුය, එසේ නොමැතිනම් ඔබට වැරදි පැවරුමක් ලැබෙනු ඇත
zbstof

4
ත්රිත්වයේ ප්රකාශය නිවැරදි ය. සිග්වින් හි (2016 මැයි), `` වැඩ කරන අතරතුර $()ක්‍රියා නොකරයි . මම මෙම පිටුව දකින තුරු නිවැරදි කිරීමට නොහැකි විය.
toddwz

2
යාවත්කාලීන කිරීම (2018) පිළිබඳ උදාහරණයක් වැනි විස්තාරණය අගය කරනු ඇත.
එඩ්වඩ්

91

විධාන වලින් විචල්‍යයන් සැකසීමට මම භාවිතා කරන සමහර බාෂ් උපක්‍රම

2 වන සංස්කරණය 2018-02-12: වෙනත් ක්‍රමයක් එක් කරන ලදි, දිගුකාලීන කාර්යයන් සඳහා මෙහි පතුලේ සොයන්න !

2018-01-25 සංස්කරණය: නියැදි ශ්‍රිතයක් එක් කරන ලදි (තැටි භාවිතය පිළිබඳ විචල්‍යයන් ජනගහනය කිරීම සඳහා)

පළමු සරල, පැරණි සහ අනුකූල ක්‍රමය

myPi=`echo '4*a(1)' | bc -l`
echo $myPi 
3.14159265358979323844

බොහෝ දුරට අනුකූල, දෙවන ක්‍රමය

කැදැල්ල බර විය හැකි බැවින් වරහන මේ සඳහා ක්‍රියාත්මක කරන ලදී

myPi=$(bc -l <<<'4*a(1)')

කැදැලි නියැදිය:

SysStarted=$(date -d "$(ps ho lstart 1)" +%s)
echo $SysStarted 
1480656334

විචල්යයන් එකකට වඩා කියවීම ( Bashisms සමඟ )

df -k /
Filesystem     1K-blocks   Used Available Use% Mounted on
/dev/dm-0         999320 529020    401488  57% /

මට භාවිතා කළ අගයක් අවශ්‍ය නම් :

array=($(df -k /))

ඔබට අරාව විචල්‍යයක් දැකිය හැකිය :

declare -p array
declare -a array='([0]="Filesystem" [1]="1K-blocks" [2]="Used" [3]="Available" [
4]="Use%" [5]="Mounted" [6]="on" [7]="/dev/dm-0" [8]="999320" [9]="529020" [10]=
"401488" [11]="57%" [12]="/")'

ඉන්පසු:

echo ${array[9]}
529020

නමුත් මම මේකට කැමතියි:

{ read foo ; read filesystem size using avail prct mountpoint ; } < <(df -k /)
echo $using
529020

පළමුවැන්න ශීර්ෂ රේඛාව මඟread foo හරිනු ඇත , නමුත් එක් විධානයකින් පමණක් ඔබ විවිධ විචල්‍යයන් 7 ක් ජනනය කරනු ඇත :

declare -p avail filesystem foo mountpoint prct size using
declare -- avail="401488"
declare -- filesystem="/dev/dm-0"
declare -- foo="Filesystem     1K-blocks   Used Available Use% Mounted on"
declare -- mountpoint="/"
declare -- prct="57%"
declare -- size="999320"
declare -- using="529020"

හෝ පවා:

{ read foo ; read filesystem dsk[{6,2,9}] prct mountpoint ; } < <(df -k /)
declare -p mountpoint dsk
declare -- mountpoint="/"
declare -a dsk=([2]="529020" [6]="999320" [9]="401488")

... සහායක අරා සමඟද ක්‍රියා කරයි:read foo disk[total] disk[used] ...

සමහර විචල්‍යයන් ජනගහනය කිරීම සඳහා නියැදි ශ්‍රිතය:

#!/bin/bash

declare free=0 total=0 used=0

getDiskStat() {
    local foo
    {
        read foo
        read foo total used free foo
    } < <(
        df -k ${1:-/}
    )
}

getDiskStat $1
echo $total $used $free

සටහන: කියවීමට පමණක් declareපේළිය අවශ්‍ය නොවේ.

ගැන sudo cmd | grep ... | cut ...

shell=$(cat /etc/passwd | grep $USER | cut -d : -f 7)
echo $shell
/bin/bash

(කරුණාකර catනිෂ් less ල වීමෙන් වළකින්න ! එබැවින් මෙය එක් දෙබලක අඩු ය:

shell=$(grep $USER </etc/passwd | cut -d : -f 7)

සියලුම පයිප්ප ( |) මඟින් දෙබලක ඇඟවුම් කරයි. වෙනත් ක්‍රියාවලියක් ක්‍රියාත්මක කළ යුතු තැන, තැටියට ප්‍රවේශ වීම, පුස්තකාල ඇමතුම් යනාදිය.

භාවිතා එසේ sedසාම්පල, එකම එක කිරීමට subprocess සීමා කරනු ලැබේ දෙබලක :

shell=$(sed </etc/passwd "s/^$USER:.*://p;d")
echo $shell

සහ බාෂිස්ම් සමඟ :

නමුත් බොහෝ ක්‍රියා සඳහා, බොහෝ විට කුඩා ලිපිගොනු වල, බාෂ්ට එම කාර්යයම කළ හැකිය:

while IFS=: read -a line ; do
    [ "$line" = "$USER" ] && shell=${line[6]}
  done </etc/passwd
echo $shell
/bin/bash

හෝ

while IFS=: read loginname encpass uid gid fullname home shell;do
    [ "$loginname" = "$USER" ] && break
  done </etc/passwd
echo $shell $loginname ...

විචල්ය බෙදීම් ගැන තවදුරටත් ඉදිරියට ...

බාෂ් හි පරිසීමකය මත නූලක් බෙදන්නේ කෙසේද යන්න පිළිබඳ මගේ පිළිතුර දෙස බලන්න.

විකල්ප: පසුබිම් සහිත දිගුකාලීන කාර්යයන් භාවිතා කරමින් දෙබල අඩු කිරීම

2 වන සංස්කරණය 2018-02-12:

වැනි බහු දෙබලක වැළැක්වීම සඳහා

myPi=$(bc -l <<<'4*a(1)'
myRay=12
myCirc=$(bc -l <<<" 2 * $myPi * $myRay ")

හෝ

myStarted=$(date -d "$(ps ho lstart 1)" +%s)
mySessStart=$(date -d "$(ps ho lstart $$)" +%s)

මෙම කාර්යය ඉතා හොඳයි, නමුත් බොහෝ දෙබලක ධාවනය කිරීම බර හා මන්දගාමී වේ.

හා විධාන කැමති dateහා bcබොහෝ මෙහෙයුම්, බවට පත් විය හැකි මාර්ගය විසින් මාර්ගය !!

බලන්න:

bc -l <<<$'3*4\n5*6'
12
30

date -f - +%s < <(ps ho lstart 1 $$)
1516030449
1517853288

එබැවින් සෑම ඉල්ලීමක් සඳහාම නව දෙබලක ආරම්භ නොකර බොහෝ රැකියා කිරීමට අපට දිගුකාලීන පසුබිම් ක්‍රියාවලියක් භාවිතා කළ හැකිය .

මෙය නිසියාකාරව සිදු කිරීම සඳහා අපට ගොනු විස්තර කිරීම් සහ ෆිෆෝස් කිහිපයක් අවශ්‍ය වේ :

mkfifo /tmp/myFifoForBc
exec 5> >(bc -l >/tmp/myFifoForBc)
exec 6</tmp/myFifoForBc
rm /tmp/myFifoForBc

(ඇත්ත වශයෙන්ම, එෆ්.ඩී. 5සහ 6භාවිතයට නොගත යුතුය!) ... එතැන් සිට ඔබට මෙම ක්‍රියාවලිය භාවිතා කළ හැක්කේ:

echo "3*4" >&5
read -u 6 foo
echo $foo
12

echo >&5 "pi=4*a(1)"
echo >&5 "2*pi*12"
read -u 6 foo
echo $foo
75.39822368615503772256

ශ්‍රිතයකට newConnector

ඔබට මගේ newConnectorක්‍රියාකාරිත්වය GitHub.Com හෝ මගේම වෙබ් අඩවියෙන් සොයාගත හැකිය (GitHub හි සටහන: මගේ වෙබ් අඩවියේ ලිපිගොනු දෙකක් තිබේ. ක්‍රියාකාරීත්වය සහ නිරූපණය එක් ගොනුවකට එකතු කර ඇති අතර ඒවා භාවිතයට ගත හැකි හෝ නිරූපණය සඳහා ධාවනය කළ හැකිය.)

නියැදිය:

. shell_connector.sh

tty
/dev/pts/20

ps --tty pts/20 fw
    PID TTY      STAT   TIME COMMAND
  29019 pts/20   Ss     0:00 bash
  30745 pts/20   R+     0:00  \_ ps --tty pts/20 fw

newConnector /usr/bin/bc "-l" '3*4' 12

ps --tty pts/20 fw
    PID TTY      STAT   TIME COMMAND
  29019 pts/20   Ss     0:00 bash
  30944 pts/20   S      0:00  \_ /usr/bin/bc -l
  30952 pts/20   R+     0:00  \_ ps --tty pts/20 fw

declare -p PI
bash: declare: PI: not found

myBc '4*a(1)' PI
declare -p PI
declare -- PI="3.14159265358979323844"

myBcසරල සින්ටැක්ස් සමඟ පසුබිම් කාර්යය භාවිතා කිරීමට ශ්‍රිතය ඔබට ඉඩ සලසයි, සහ දිනය සඳහා:

newConnector /bin/date '-f - +%s' @0 0
myDate '2000-01-01'
  946681200
myDate "$(ps ho lstart 1)" boottime
myDate now now ; read utm idl </proc/uptime
myBc "$now-$boottime" uptime
printf "%s\n" ${utm%%.*} $uptime
  42134906
  42134906

ps --tty pts/20 fw
    PID TTY      STAT   TIME COMMAND
  29019 pts/20   Ss     0:00 bash
  30944 pts/20   S      0:00  \_ /usr/bin/bc -l
  32615 pts/20   S      0:00  \_ /bin/date -f - +%s
   3162 pts/20   R+     0:00  \_ ps --tty pts/20 fw

එතැන් සිට, ඔබට පසුබිම් ක්‍රියාවලියක් අවසන් කිරීමට අවශ්‍ය නම්, ඔබ එහි fd වසා දැමිය යුතුය :

eval "exec $DATEOUT>&-"
eval "exec $DATEIN>&-"
ps --tty pts/20 fw
    PID TTY      STAT   TIME COMMAND
   4936 pts/20   Ss     0:00 bash
   5256 pts/20   S      0:00  \_ /usr/bin/bc -l
   6358 pts/20   R+     0:00  \_ ps --tty pts/20 fw

එය අවශ්‍ය නොවේ, මන්ද ප්‍රධාන ක්‍රියාවලිය අවසන් වූ විට සියලු fd වසා දමයි.


ඉහත සඳහන් කැදැලි නියැදිය මා සොයන දෙයයි. සරල ක්‍රමයක් තිබිය හැකිය, නමුත් මා සොයමින් සිටියේ පරිසර විචල්‍යයක එහි නම ලබා දී ඇති ඩොකර් බහාලුමක් දැනටමත් තිබේද යන්න සොයා බැලීමේ ක්‍රමයයි. ඉතින් මට: EXISTING_CONTAINER=$(docker ps -a | grep "$(echo $CONTAINER_NAME)")මම සොයන ප්‍රකාශයද?
Capricorn1

2
@ capricorn1 එය නිෂ් less ල භාවිතයකිecho ; ඔබට සරලව අවශ්‍යයිgrep "$CONTAINER_NAME"
ත්‍රිත්ව


මට මෙහි යමක් මග හැරී ඇත: kubectl get ns | while read -r line; do echo $ line | grep Term | cut -d '' -f1 ; doneසෑම $lineහිස් පේළියක් සඳහාම මුද්‍රණය කර ඉන්පසු bash: xxxx: command not found. කෙසේ වෙතත්, එය මුද්‍රණය කරනු ඇතැයි මම බලාපොරොත්තු xxx
වෙමි

77

ඔවුන් දැනටමත් ඔබට පෙන්වා ඇති පරිදි, ඔබ 'බැක්ටික්ස්' භාවිතා කළ යුතුය.

විකල්ප යෝජිත $(command)ක්‍රියා මෙන්ම කියවීමද පහසුය, නමුත් එය වලංගු වන්නේ බාෂ් හෝ කෝර්න්ෂෙල් (සහ ඒවායින් ලබාගත් ෂෙල් වෙඩි) සමඟ පමණක් බව සලකන්න, එබැවින් ඔබේ ස්ක්‍රිප්ට් විවිධ යුනික්ස් පද්ධති මත අතේ ගෙන යා හැකි නම්, ඔබ කැමති විය යුතුය පැරණි බැක්ටික්ස් අංකනය.


24
ඔවුන් ඉතා සුපරීක්ෂාකාරී ය. බොහෝ කලකට පෙර පොසික්ස් විසින් බැක්ටික්ස් ඉවත් කර ඇත; වඩාත් නවීන සින්ටැක්ස් මෙම සහස්‍රයේ සිට බොහෝ ෂෙල් වෙඩි වලින් ලබා ගත යුතුය. (එහි තවමත් උරුමය වාතාවරණය කැස්ස HP-UX කැස්ස මුල් අරගලයද දැඩිව හිර කරන.)
tripleee

26
වැරදියි. $()දශක දෙකකට පෙර ප්‍රමිතිගත කර ඇති පරිදි POSIX sh සමඟ සම්පුර්ණයෙන්ම අනුකූල වේ.
චාල්ස් ඩෆි

3
/bin/shසොලාරිස් 10 හි තවමත් හඳුනාගෙන නොමැති බව සලකන්න $(…)- සහ සොලාරිස් 11 හි AFAIK ද සත්‍ය වේ.
ජොනතන් ලෙෆ්ලර්

3
On ජොනතන් ලෙෆ්ලර් ඇත්ත වශයෙන්ම සොලාරිස් 11 සිටින තැන /bin/shඑය එසේ නොවේ ksh93.
jlliagre

2
ripripleee - ප්‍රතිචාරය වසර තුනක් ප්‍රමාදයි :-) නමුත් මම $()පසුගිය අවුරුදු 10+ පුරා HP-UX හි POSIX කවචයේ භාවිතා කර ඇත්තෙමි .
බොබ් ජාවිස් - මොනිකා

54

එය කිරීමට ක්‍රම තුනක් මම දනිමි:

  1. එවැනි කාර්යයන් සඳහා කාර්යයන් සුදුසු ය: **

    func (){
        ls -l
    }

    කියමින් එයට ආරාධනා කරන්න func.

  2. තවත් සුදුසු විසඳුමක් විය හැකිය:

    var="ls -l"
    eval $var
  3. තෙවැන්න විචල්යයන් කෙලින්ම භාවිතා කරයි:

    var=$(ls -l)
    
        OR
    
    var=`ls -l`

තෙවන විසඳුමේ ප්‍රතිදානය ඔබට හොඳ ආකාරයකින් ලබා ගත හැකිය:

echo "$var"

ඒ වගේම නපුරු ආකාරයකින්:

echo $var

1
පළමු දෙදෙනා දැනට පවතින ආකාරයට ප්‍රශ්නයට පිළිතුරු සපයන බවක් නොපෙනෙන අතර දෙවැන්න සාමාන්‍යයෙන් සැක සහිත ය.
ත්‍රිත්ව

1
මුළුමනින්ම අළුත් කෙනෙකු ලෙස, "$var"හොඳ සහ $varනපුරු වන්නේ ඇයි?
පීටර්



22

විචල්ය පසුබිම සැකසීම විට වග බලා ගන්න ඔබට ඇති නැත ස්ථාන පෙර සහ / හෝ පසු = ලකුණක්. වචනානුසාරයෙන් පැයක් ගත කරමින් මෙය වටහා ගැනීමට උත්සාහ කරමින් සියලු ආකාරයේ විසඳුම් අත්හදා බැලීය! මෙය සිසිල් නොවේ.

නිවැරදි:

WTFF=`echo "stuff"`
echo "Example: $WTFF"

කැමැත්ත අසමත් හෝ ඒ හා සමාන: දෝෂය "සොයාගත නොහැකි දේවල්" සමග

WTFF= `echo "stuff"`
echo "Example: $WTFF"

2
අවකාශය සමග අනුවාදය වෙනස් දෙයක් අදහස් : var=value somecommandලකුණු somecommandසමග varඑහි පරිසරයක් තුළ වටිනාකමක් නැති value. මේ අනුව, var= somecommandඅපනයනය කරන්නේ හිස් (ශුන්‍ය-බයිට්) අගයක් සහිත varපරිසරයක ය somecommand.
චාල්ස් ඩෆි

ඔව්, බාෂ් ගොචා.
පීටර් මෝර්ටෙන්සන්

14

ඔබට එය බහු රේඛීය / බහු විධානයන් සමඟ කිරීමට අවශ්‍ය නම් ඔබට මෙය කළ හැකිය:

output=$( bash <<EOF
# Multiline/multiple command/s
EOF
)

හෝ:

output=$(
# Multiline/multiple command/s
)

උදාහරණයක්:

#!/bin/bash
output="$( bash <<EOF
echo first
echo second
echo third
EOF
)"
echo "$output"

ප්‍රතිදානය:

first
second
third

හෙරෙඩොක් භාවිතා කරමින් , ඔබේ දිගු තනි රේඛා කේතය බහු රේඛාවක් බවට පත් කිරීමෙන් ඔබට ඉතා පහසුවෙන් දේවල් සරල කළ හැකිය. තවත් උදාහරණයක්:

output="$( ssh -p $port $user@$domain <<EOF
# Breakdown your long ssh command into multiline here.
EOF
)"

2
bashවිධාන ආදේශනය ඇතුළත දෙවැන්න කුමක්ද? ආදේශන විධාන මඟින් ඔබ දැනටමත් උපසිරැසියක් නිර්මාණය කරමින් සිටී. ඔබට බහු විධාන දැමීමට අවශ්‍ය නම්, ඒවා නව රේඛාවකින් හෝ අර්ධ සළකුණකින් වෙන් කරන්න. output=$(echo first; echo second; ...)
ත්‍රිත්ව

එවිට ඒ හා සමානව 'bash -c "bash -c \"bash -c ...\""'"වෙනස්" වනු ඇත; නමුත් එහි කාරණය මට නොපෙනේ.
ත්‍රිත්ව

ripripleee heredoc යන්නෙන් අදහස් කරන්නේ ඊට වඩා වැඩි යමක්. ssh sudo -sඇතුළත MySQL විධානයන් ක්‍රියාත්මක කිරීම වැනි වෙනත් විධානයන් සමඟද ඔබට එය කළ හැකිය . (
බාෂ්

1
මට දැනෙන්නේ නැහැ අපි නිසි ලෙස සන්නිවේදනය කරනවා කියලා. මම පුරා ප්රයෝජනවත් අභියෝග කරමි variable=$(bash -c 'echo "foo"; echo "bar"')පුරා variable=$(echo "foo"; echo "bar")ඇති මෙහි ලියවිල්ල පමණක් උපුටා දක්වමින් යාන්ත්රණයක් වන අතර, ඇත්තටම තවත් වැඩකට නැති නිසාම මිස අන් කිසිවක් එකතු කරන්නේ -.
ත්‍රිත්ව

2
මම ssh සමඟ හෙරඩොක් භාවිතා කරන විට, අනතුරු ඇඟවීම ssh -p $port $user@$domain /bin/bash <<EOFවැළැක්වීම සඳහා ධාවනය කළ යුතු විධානය මම හරියටම කියමිPseudo-terminal will not be allocated because stdin is not a terminal.
එෆ්. හවුරි

9

ඔබත් භාවිතා කළ යුතුයි

$(command-here)

හෝ

`command-here`

උදාහරණයක්

#!/bin/bash

VAR1="$1"
VAR2="$2"

MOREF="$(sudo run command against "$VAR1" | grep name | cut -c7-)"

echo "$MOREF"


1
ඔබට කූඩුව දැමිය හැකි බව මම දැන නොසිටි නමුත් එය පරිපූර්ණ අර්ථයක් ලබා දෙයි, තොරතුරු සඳහා බොහෝම ස්තූතියි!
ඩියාගෝ වෙලේස්

6

මෙය තවත් ක්‍රමයක් වන අතර ඔබ නිර්මාණය කරන සෑම සංකීර්ණ කේතයක්ම නිවැරදිව ඉස්මතු කිරීමට නොහැකි සමහර පෙළ සංස්කාරකවරුන් සමඟ භාවිතා කිරීම හොඳ ය:

read -r -d '' str < <(cat somefile.txt)
echo "${#str}"
echo "$str"

මෙය OP හි ප්‍රශ්නය සමඟ කටයුතු නොකරයි, එය සැබවින්ම විධාන ආදේශනය ගැන මිස ක්‍රියාවලියක් ආදේශ කිරීම නොවේ .
codeforester

6

ඔබට බැක්ටික්ස් (උච්චාරණ සොහොන් ලෙසද හැඳින්වේ) හෝ භාවිතා කළ හැකිය $().

මෙන්:

OUTPUT=$(x+2);
OUTPUT=`x+2`;

දෙකම එකම බලපෑමක් ඇති කරයි. නමුත් OUTPUT = $ (x + 2) වඩා කියවිය හැකි අතර නවතම එකකි.


2
කැදැල්ලට අවසර දීම සඳහා වරහන්කරණය ක්‍රියාත්මක කරන ලදී.
එෆ්. හවුරි

5

ඔබ ක්‍රියාත්මක කිරීමට උත්සාහ කරන විධානය අසමත් වුවහොත්, එය ප්‍රතිදානය දෝෂ ප්‍රවාහයට ලියන අතර පසුව එය කොන්සෝලය වෙත මුද්‍රණය වේ.

එය වළක්වා ගැනීම සඳහා, ඔබ දෝෂ ප්‍රවාහය නැවත හරවා යැවිය යුතුය:

result=$(ls -l something_that_does_not_exist 2>&1)

4

සමහරුන්ට මෙය ප්‍රයෝජනවත් විය හැකිය. උපක්‍රමය $(())ද්විත්ව වරහන් භාවිතා කරන විචල්‍ය ආදේශකයේ පූර්ණ සංඛ්‍යා :

N=3
M=3
COUNT=$N-1
ARR[0]=3
ARR[1]=2
ARR[2]=4
ARR[3]=1

while (( COUNT < ${#ARR[@]} ))
do
  ARR[$COUNT]=$((ARR[COUNT]*M))
  (( COUNT=$COUNT+$N ))
done

1
මෙම ප්‍රශ්නයට මෙයට කිසිදු අදාළත්වයක් ඇති බවක් නොපෙනේ. නිරන්තරයෙන් සාධකයක් මගින් අරාවෙහි සංඛ්‍යාවක් ගුණ කරන්නේ කෙසේදැයි යමෙකු ඇසුවොත් එය සාධාරණ පිළිතුරක් වනු ඇත, නමුත් කිසිවෙකු එය අසන බව මට මතක නැත (එවිට for ((...))ලූපයක් ලූප් විචල්‍යයට වඩා හොඳ ගැලපීමක් සේ පෙනේ ). එසේම, ඔබ ඔබේ පුද්ගලික විචල්‍යයන් සඳහා ලොකු අකුර භාවිතා නොකළ යුතුය.
ත්‍රිත්ව

මම "අදාළ" කොටස සමඟ එකඟ නොවෙමි. ප්‍රශ්නය පැහැදිලිව කියවේ: බාෂ් හි විධානයකින් ප්‍රතිදානයට සමාන විචල්‍යයක් සකසන්නේ කෙසේද? මම මෙම පිළිතුර අනුපූරකයක් ලෙස එකතු කළේ මා පසුව පළ කළ කේතය සඳහා උපකාරී වූ විසඳුමක් සොයන බැවිනි. ලොකු අකුරු සම්බන්ධයෙන්, ඒ සඳහා ස්තූතියි.
ගුස්

1
මෙය ලිවිය හැකි ARR=(3 2 4 1);for((N=3,M=3,COUNT=N-1;COUNT < ${#ARR[@]};ARR[COUNT]*=M,COUNT+=N)){ :;}නමුත් මම ට්‍රිප්ලී සමඟ එකඟ වෙමි: මෙය කරන්නේ කුමක් දැයි මට තේරෙන්නේ නැත, එතැන!
එෆ්. හවුරි

@ එෆ්. හවුරි ... බාෂ් ඔබ තව තවත් ගැඹුරට යන විට පර්ල් මෙන් වැඩි වෙමින් පවතී!
රොබ්ලොජික්

4

මෙන්න තවත් ක්‍රම දෙකක්:

Bash හි අවකාශය ඉතා වැදගත් බව කරුණාකර මතක තබා ගන්න. එබැවින්, ඔබේ විධානය ක්‍රියාත්මක කිරීමට ඔබට අවශ්‍ය නම්, තවත් ඉඩක් හඳුන්වා නොදී භාවිතා කරන්න.

  1. පහත සඳහන් පැවරුම් harshilසඳහා Lසහ එය මුද්රණය කරයි

    L=$"harshil"
    echo "$L"
  2. පහත දැක්වෙන්නේ විධානයේ ප්‍රතිදානය trL2 වෙත පවරයි . trවෙනත් විචල්‍යයක් වන L1 මත ක්‍රියාත්මක වේ.

    L2=$(echo "$L1" | tr [:upper:] [:lower:])

4
1. $"..."බොහෝ විට ඔබ සිතන දේ නොකරයි . 2. මෙය දැනටමත් ඇන්ඩි ලෙස්ටර්ගේ පිළිතුරෙන් දක්වා ඇත.
gniourf_gniourf

@gniourf_gniourf නිවැරදියි: බලන්න බාෂ් ප්‍රාදේශීයකරණය බහු රේඛා සමඟ ක්‍රියා නොකරනු ඇත . නමුත් යටතේ bash , ඔබ භාවිතා කළ හැකි echo ${L1,,}downcase කිරීම, හෝ echo ${L1^^}upcase කිරීමට.
එෆ්. හවුරි
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.