GNU/Linux >> Znalost Linux >  >> Linux

Bash - příkaz Datum a mezera

Správný přístup je definovat svou vlastní funkci ve skriptu Bash.

function my_date {
  date "+%y-%m-%d %H:%M:%S"
}

Nyní můžete použít my_date jako by to byl externí program.

Například:

echo "It is now $(my_date)."

Nebo jednoduše:

my_date

Proč váš přístup nefunguje?

První problém je, že váš úkol je nefunkční.

DATE_COMMAND="date "+%y-%m-%d %H:%M:%S""

Toto je analyzováno jako přiřazení řetězce date +%y-%m-%d do proměnné DATE_COMMAND . Po prázdném místě začne shell interpretovat zbývající symboly způsobem, který jste nezamýšleli.

To by mohlo být částečně opraveno změnou nabídky.

DATE_COMMAND="date '+%y-%m-%d %H:%M:%S'"

To však problém ve skutečnosti neřeší, protože pokud nyní použijeme

echo $($DATE_COMMAND)

Nerozšíří argument správně. date program uvidí argumenty '+%y-%m-%d a %H:%M:%S' (s uvozovkami) místo jednoho řetězce. To lze vyřešit pomocí eval jako v

DATE_COMMAND="date '+%y-%m-%d %H:%M:%S'"
echo $(eval $DATE_COMMAND)

kde je proměnná DATE_COMMAND je nejprve rozšířen na řetězec date '+%y-%m-%d %H:%M:%S' to je potom eval zadáváno, jako by to bylo napsáno takto, tedy vyvolání date správně.

Všimněte si, že to ukazuji pouze pro vysvětlení problému. eval zde není dobré řešení. Místo toho použijte funkci.

PS Je lepší se vyhnout řetězcům identifikátorů psaným pouze velkými písmeny, protože ty jsou často v konfliktu s proměnnými prostředí nebo dokonce mají pro shell magický význam.


Útěk z prostoru mi funguje.

echo `date +%d.%m.%Y\ %R.%S.%3N` 

Linux
  1. Nastavte datum a čas pro každý příkaz, který provedete v historii Bash

  2. Příkaz historie zobrazující adresář a datum?

  3. příkaz pro export bash

  1. Rozdíl mezi ‚A‘ na příkazovém řádku (bash)??

  2. eval příkaz v Bash a jeho typické použití

  3. Porovnání dat v Bash

  1. Vysvětlení příkazu Bash trap

  2. Je povoleno místo mezi #! A /bin/bash v Shebangu?

  3. Jaký je rozdíl mezi &> a >&v bash?