С помощью zsh
: с
cd /media/storage/**/Fedora([1]:h)
по компакт-диск
в первый (в алфавитном порядке) каталог, содержащий файл с именем Fedora
.
**
: любой уровень каталогов (скрытые каталоги по умолчанию опущены, используйте квалификатор glob D
, чтобы включить их) [1]
: только первый : h
]: head модификатор: взять имя каталога. В отличие от cd "$ (find ...)"
, он также работает, если имя каталога заканчивается символом новой строки. Еще одно преимущество состоит в том, что вы получите сообщение об ошибке no match , когда нет подходящего каталога (в то время как в большинстве оболочек cd ""
ничего не делает в автоматическом режиме).
Недостатком является то, что перед возвратом он будет сканировать весь / media / storage
.
Переменная предназначена для данных, а не кода. Определите функцию. Это также упрощает ваше цитирование.
#!/bin/bash
userName="user"
passWord="password"
tenantName="tenant"
commande () {
curl -X POST \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Postman-Token: ..." \
-d@- \
http://controller:5000/v2.0/tokens <<EOF
{
"auth": {
"tenantName": "$tenantName",
"passwordCredentials": {
"username": "$userName",
"password": "$password"
}
}
}
EOF
}
Вышеупомянутое также считывает JSON из здесь-документа ( @ -
считывает аргумент для параметра -d
из стандартного ввода) вместо того, чтобы встраивать его в строку для дальнейшего упростить цитирование.
Тем не менее, также плохая идея вручную кодировать JSON таким образом, если вы не гарантируете, что значения userName
, passWord
и tennatnName
правильно закодированы в JSON. Лучшее решение - использовать что-то вроде jq
, чтобы сгенерировать для вас правильный JSON.
commande () {
json_template='{
auth: {
tenantName: $tn,
passwordCredentials: {
username: $un,
password: $pw
}
}
}'
jq -n --arg un "$userName" \
--arg pw "$passWord" \
--arg tn "$tenantName" "$json_template" |
curl -X POST
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Postman-Token: ..." \
-d@- \
http://controller:5000/v2.0/tokens
}