bash: назначить переменную и вывести ее на стандартный вывод в той же команде [закрыто]

Si está de acuerdo con tener un segundo archivo para procesar esto, puede crear un archivo XSLT y usarlo para transformar su archivo XML usando xsltproc.

teléfonos.xsl:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="ContactPerson">
  <xsl:value-of select="GivenName"/><xsl:text> </xsl:text><xsl:value-of select="FamilyName"/>
  <xsl:for-each select="PhoneFixList/PhoneFix">
    <xsl:text> </xsl:text><xsl:value-of select="."/>
  </xsl:for-each>
  <xsl:for-each select="EmailList/Email">
    <xsl:text> </xsl:text><xsl:value-of select="."/>
  </xsl:for-each>
  <xsl:text>&#xA;</xsl:text>
</xsl:template>
</xsl:stylesheet>

Luego transforme el archivo (usando el XML de @Kusalananda comophones.xml):

$ xsltproc phones.xsl phones.xml
John Wayne 78787878 john.wayne@gmail.com
James Stewart 90909090 james.stewart@gmail.com

El uso de XSLT tiene la ventaja de que puede recorrer elementos repetitivos, generar resultados condicionales, etc. Si te sientes cómodo con un poco de estudio y programación, es muy poderoso.

1
06.09.2018, 21:05
3 ответа

Если вы заключите свой первый аргумент в $(), вы получите желаемый результат.

./test.sh "$(VAR=abc; echo $VAR)" "def"

В этом случае bash будет использовать подоболочку для выполнения настройки VAR=abc, за которой следует echo $VAR, а затем STDOUT из этой подоболочки используется в качестве аргумента test.sh$1.


РЕДАКТИРОВАТЬ

Чтобы получить обе переменные, назначенные из одной настройки переменной, вам нужно получить обе из подоболочки.

./test.sh $(VAR='abc'; echo $VAR $VAR)

Удалив кавычки вокруг $(), мы знаем, что поймать первое слово в STDOUT подоболочки как $1, а второе слово как $2.

Однако, поскольку $VARне устанавливается в родительской оболочке, вы не можете использовать $VARнапрямую.

Однако вы можете использовать подоболочку для установки $VAR.

VAR=$(VAR=abc; echo $VAR)./test.sh $VAR $VAR

или для удобства чтения

VAR=$(FOO=abc; echo $FOO)./test.sh $VAR $VAR
0
28.04.2021, 23:42

Почему бы и нет var=abc;./test.sh "$var" "$var"?

Или вызовите скрипт с одним аргументом, и скрипт обработает отсутствующее значение:

#!/bin/bash
fieldValue1=$1
fieldValue2=${2:-$1}
...

, затем:./test.sh fooвыводит{"field1"="foo", "field2"="foo"}


Обратите внимание, что это не JSON :используйте двоеточие, не равное:{"field1":"foo", "field2":"foo"}

Также вы оставляете переменные без кавычек, когда назначаете переменную jsonString. Сделай это

jsonString='{"field1":"'"$fieldValue1"'", "field2":"'"$fieldValue2"'"}'
#......................^............^...............^............^
# or
jsonString="{'field1':'$fieldValue1', 'field2':'$fieldValue2'}"
# or
printf -v jsonString '{"field1":"%s","field2":"%s"}' "$fieldValue1" "$fieldValue2"

Также следует защититься от значений, содержащих кавычки:

printf -v jsonString '{"field1":"%s","field2":"%s"}' \
    "${fieldValue1//\"/\\\"}" \
    "${fieldValue2//\"/\\\"}"

Тогда

$./test.sh 'he said "foo"'
{"field1":"he said \"foo\"","field2":"he said \"foo\""}

На основе обновленных требований. Назначение переменной должно быть отдельным шагом. Вам также не хватает синтаксиса замены команды$(...)

Первый обновленный скрипт:

#!/bin/bash
pairs=()
for ((i=1; i<=$#; i++)); do
    value=${!i}
    pairs+=( "$(printf '"%s":"%s"' "field$i" "${value//\"/\\\"}")" )
done
IFS=,
echo "{${pairs[*]}}"

Затем вызовите его следующим образом

startDate=1/1/2020
bash test.sh "$startDate" someOtherValue "$startDate" "$(date -u -d "$startDate 1 hour" "+%FT%TZ")" "anotherValue"

и получите этот вывод:

{"field1":"1/1/2020","field2":"someOtherValue","field3":"1/1/2020","field4":"2020-01-01T01:00:00Z","field5":"anotherValue"}
2
28.04.2021, 23:42

Похоже, вы пытаетесь заново изобрести csvjsonиз CSVkit:

$ cat file.csv
A,B,C
1,2,3
4,5,6

$ csvjson file.csv
[{"A": 1.0, "B": 2.0, "C": 3.0}, {"A": 4.0, "B": 5.0, "C": 6.0}]

$ csvjson -i 4 file.csv
[
    {
        "A": 1.0,
        "B": 2.0,
        "C": 3.0
    },
    {
        "A": 4.0,
        "B": 5.0,
        "C": 6.0
    }
]
0
28.04.2021, 23:42

Теги

Похожие вопросы