Как сохранить кавычки в аргументах Bash? [дубликат]

Если столбец не существует, то вы должны указать значение по умолчанию с помощью функции lit (), иначе она выдаст ошибку. Следующее работало для меня

scala> defaultHour
res77: String = 00

scala> :paste
// Entering paste mode (ctrl-D to finish)

def addTimestampFromFileCols(df:DataFrame) =
{
val hr = if( df.columns.contains("hour") ) col(COLUMN_HOUR) else lit(defaultHour)
df.withColumn(COLUMN_TS, addTimeFromCols(col(COLUMN_YEAR), col(COLUMN_MONTH), col(COLUMN_DAY), hr).cast(TimestampType))
}

// Exiting paste mode, now interpreting.

addTimestampFromFileCols: (df: org.apache.spark.sql.DataFrame)org.apache.spark.sql.DataFrame

scala> 

+ ve case

scala> val df = Seq(("2019","01","10","09")).toDF("year","month","day","hour")
df: org.apache.spark.sql.DataFrame = [year: string, month: string ... 2 more fields]

scala> addTimestampFromFileCols(df).show(false)
+----+-----+---+----+-------------------+
|year|month|day|hour|tstamp             |
+----+-----+---+----+-------------------+
|2019|01   |10 |09  |2019-01-10 09:00:00|
+----+-----+---+----+-------------------+

-ve чехол

scala> val df = Seq(("2019","01","10")).toDF("year","month","day")
df: org.apache.spark.sql.DataFrame = [year: string, month: string ... 1 more field]

scala> addTimestampFromFileCols(df).show(false)
+----+-----+---+-------------------+
|year|month|day|tstamp             |
+----+-----+---+-------------------+
|2019|01   |10 |2019-01-10 00:00:00|
+----+-----+---+-------------------+

scala>
69
задан codeforester 19 December 2017 в 05:43
поделиться

5 ответов

Просто используйте одинарные кавычки вокруг строки с двойными кавычками:

./test.sh this is '"some test"'

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

Но я бы рекомендовал поставить целая строка в одинарных кавычках:

 ./test.sh 'this is "some test" '

Чтобы понять, что делает оболочка или, скорее, интерпретировать аргументы в сценариях, вы можете написать небольшой сценарий вроде этого:

#!/bin/bash

echo $@
echo "$@"

Затем вы увидите и протестируете, что происходит при вызове скрипт с разными строками

-11
ответ дан 24 November 2019 в 13:39
поделиться

Если бы необходимо передать все аргументы для избиения от другого языка программирования (например, если Вы хотели бы выполниться bash -c или emit_bash_code | bash), используйте это:

  • Escape все символы одинарной кавычки Вы имеете с '\''.
  • тогда, окружите результат исключительными кавычками

, аргумент abc'def будет таким образом преобразован в 'abc'\''def'. Символы '\'' интерпретируются как следующее: уже существующее заключение в кавычки завершается с первой первой кавычкой, тогда завершенная исключительная одинарная кавычка \' прибывает, тогда новое заключение в кавычки запускается.

0
ответ дан 24 November 2019 в 13:39
поделиться

Если можно с уверенностью предположить, что аргумент, содержащий пробелы, должен быть (и должен быть) заключен в кавычки, то вы можете добавить их следующим образом:

#!/bin/bash
whitespace="[[:space:]]"
for i in "$@"
do
    if [[ $i =~ $whitespace ]]
    then
        i=\"$i\"
    fi
    echo "$i"
done

Вот пример выполнения:

$ ./argtest abc def "ghi jkl" $'mno\tpqr' $'stu\nvwx'
abc
def
"ghi jkl"
"mno    pqr"
"stu
vwx"

Вы также можете вставьте буквенные табуляции и символы новой строки, используя Ctrl - V Tab и Ctrl - V Ctrl ] - J в двойных или одинарных кавычках вместо использования экранирования внутри $ '...' .

Примечание о вставке символов в Bash: если вы используете привязки клавиш Vi ( set -o vi ) в Bash (Emacs по умолчанию - set -o emacs ), вам нужно будет войти в insert режим для вставки символов . В режиме Emacs вы всегда находитесь в режиме вставки.

33
ответ дан 24 November 2019 в 13:39
поделиться

с использованием « $ @ » подставит аргументы в виде списка без повторного разделения их на пробелы (они были разделены один раз при вызове сценария оболочки), что обычно это именно то, что вам нужно, если вы просто хотите повторно передать аргументы другой программе.

Что вы пытаетесь сделать и каким образом это не работает?

82
ответ дан 24 November 2019 в 13:39
поделиться

Цитаты интерпретируются bash и не сохраняются в аргументах командной строки или значениях переменных.

Если вы хотите использовать аргументы в кавычках, вы должны заключать их в кавычки каждый раз, когда вы их используете:

val="$3"
echo "Hello World" > "$val"
3
ответ дан 24 November 2019 в 13:39
поделиться
Другие вопросы по тегам:

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